我使用google apps脚本在电子表格中添加了一个新菜单项。此菜单项创建一个文件,但我希望它在创建后启动文件下载。
这可能吗?
请记住,这不是网络应用,而是电子表格中的菜单项。
由于
修改
感谢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)
}
答案 0 :(得分:6)
编辑 :阅读下面的评论,当他指出“复杂”版本的局限时,Zig Mandel是完全正确的,它真的很简单(而且很有趣) )练习显示其他方法。
我认为您必须使用中间Ui作为弹出窗口来确认下载。 在那之后,我知道有两种可能的方法,一种是非常简单的,另一种是非常麻烦的,做出你的选择,下面的代码显示了它们。
注意:要使用部署应用程序所需的复杂应用程序(即保存版本并部署为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: - )