Google apps script 启动从谷歌应用程序脚本下载

Google apps script 启动从谷歌应用程序脚本下载,google-apps-script,google-drive-api,Google Apps Script,Google Drive Api,我使用谷歌应用程序脚本在电子表格中添加了一个新的菜单项。此菜单项创建一个文件,但我希望它在创建文件后启动下载 这可能吗 记住,这不是一个web应用程序,而是我的电子表格中的一个菜单项 谢谢 编辑: 感谢Serge insas的建议,下面的简单脚本非常有效,并打开了一个包含我需要的链接的下载窗口: function onOpen() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var csvMenuEntries = [ {name:

我使用谷歌应用程序脚本在电子表格中添加了一个新的菜单项。此菜单项创建一个文件,但我希望它在创建文件后启动下载

这可能吗

记住,这不是一个web应用程序,而是我的电子表格中的一个菜单项

谢谢

编辑:

感谢Serge insas的建议,下面的简单脚本非常有效,并打开了一个包含我需要的链接的下载窗口:

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var csvMenuEntries = [ {name: "Zip all CSVs", functionName: "saveAsCSV"} ];
  ss.addMenu("CSV", csvMenuEntries);
};

function saveAsCSV() {
  var folder = createCSVs(); // creates a folder with CSV for each Sheet
  var zipFile = zipCSVs(folder, "DI.zip"); // creates a zip of all CSVs in folder

  var ui = UiApp.createApplication().setTitle("Download");
  var p = ui.createVerticalPanel();
  ui.add(p);
  p.add(ui.createAnchor("Download", zipFile.getDownloadUrl()));
  SpreadsheetApp.getActive().show(ui)
}
编辑:阅读下面的评论,Zig Mandel指出“复杂”版本的局限性是完全正确的,展示其他方法确实是一个简单(有趣)的练习


我认为您必须使用中间用户界面作为弹出窗口来确认下载。 在这之后,我知道有两种可能的方法,一种非常简单,另一种非常麻烦,请选择,下面的代码显示了这两种方法

注意:要使用复杂的应用程序,您需要部署应用程序(即保存一个版本并部署为webapp),对于简单的应用程序,只需“按原样”使用即可。(我在代码注释中显示了简单代码)

守则:

function onOpen() {
  var menuEntries = [ {name: "test download", functionName: "downloadFile"}
                     ];
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  sheet.addMenu("Utils",menuEntries);
}

function downloadFile(){
  var file = DriveApp.createFile('test file', 'Some content in this file to test it');
  var fileID = file.getId();
  var fileName = file.getName();
  var ui = UiApp.createApplication().setTitle('Download');
  var url = ScriptApp.getService().getUrl()+'?&ID='+fileID+'&name='+fileName;
  var p = ui.createVerticalPanel();
  ui.add(p);
  p.add(ui.createAnchor('click to download', url));
  p.add(ui.createAnchor('or use this link ',file.getDownloadUrl()));// this is the simple one, just get the file you created and use getDownloadUrl()
  SpreadsheetApp.getActive().show(ui)
}

function doGet(e){
  var fileId = e.parameter.ID;
  var fileName = e.parameter.name;
  var fileString = DocsList.getFileById(fileId).getContentAsString();
  return ContentService.createTextOutput(fileString).downloadAsFile(fileName);
}

PS:我写这篇文章很有趣,“复杂版本”真的很有趣,imho:-)

第一个版本很好。没有必要使用第二个版本,而且它只适用于文本文件。用户可以创建任何类似pdf的东西(你可以改进它,使其服务于文件blob而不是其文本内容),但你不会比First oneHmm有任何优势,设法从所有方法中混淆,我不太熟悉谷歌应用程序脚本API。。。我试过了,但什么也没发生:var ui=UiApp.createApplication().setTitle(“下载”);var p=ui.createVerticalPanel();ui.添加(p);p、 添加(ui.createAnchor(“下载”,zipFile.getDownloadUrl());那应该没问题,你失败了吗?(很抱歉让您感到困惑,这不是我的本意)Anchor已被弃用请参阅[类似SO问题][1][1]中我的更新解决方案:在我的情况下
ScriptApp.getService().getUrl()
返回null,生成的url为:
https://www.google.com/url?q=null%3FID%3D0B8Ow9luRlTVXcELALALALAI3NDA%26name%3Dtest%2Ftest-file.json&sa=N&usd=2&usg=AFQjCNFAzvfgpPZSTaP8Fuj7-biYe4Xv2g
如果可以的话,我认为setWidth和setHeight在这样的UI中非常有用,因为它有点空,不是吗?是的,但我只自己使用它,所以这并不重要。但谢谢。Anchor已被弃用。请参阅[类似SO问题][1][1]中我的更新解决方案: