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のみで行ってます。