Googleスプレッドシートでローカルにファイルをダウンロードしたい場合があると思います。

たくさんの方が手法を共有されているのですが、ファイル名を指定してダウンロードしたい時に、ずばりそのものが書いてあるサイトがなかったので手法共有です。

 

スプッドシートにボタンを設置してクリックすると、アクティブなスプレッドシートのシート名で入力内容を自動でローカルダウンロードします。

 

GoogleAppsScript: .gs側 getFileName()でファイル名を作成して返却している。

function main() {

  // evaluate() は dialog.html 内の GAS を実行するため( <?= => の箇所)
  var html = HtmlService.createTemplateFromFile("download_dialog").evaluate();
  
  // 下記HTMLファイルをダイアログ出力
  SpreadsheetApp.getUi().showModalDialog(html, "SQLファイルダウンロード");  
  
}
function getFileName() {

  // 現在アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSheet();
  const file_name = sheet.getSheetName() + ".sql";
  // そのシートのシート名を返却
  return file_name;  

}
function createDDL() {
  
  // DDL文領域
  let str_query = "";

  // 現在のシートを取得
  let sheet = SpreadsheetApp.getActiveSheet();

 // 省略。。。

  // 最後の〆
  str_query = str_query + ";\r\n";
  
  return str_query;
}

 

ダイアログHTML:download_dialog.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script type='text/javascript'>    
      function handleDownload() {
        const content = <?= createDDL(); ?>;  // DDLをGASから取得
        const blob = new Blob([ content ], { "type" : "text/plain"});

        if (window.navigator.msSaveBlob) { 
            window.navigator.msSaveBlob(blob, file_name); 
        } else {
            document.getElementById("download").href = window.URL.createObjectURL(blob);
        }

      }
  </script>  
  </head>
  <body>
     <a id="download" href="#" download="<?= getFileName(); ?>" onclick="handleDownload()">ここクリックしてDDLダウンロード</a>
  </body>
</html>

 

HTML側を呼び出す度にaタグのdownload属性を取得しているのがキモです。

動作確認はChromeのみで行ってます。