下载"自动"将电子表格作为.xlsx发送到本地机器上的事件

时间:2016-05-13 14:06:08

标签: google-apps-script google-sheets google-drive-api

请参阅下面将有效Google电子表格转换为.xlsx文件的功能。该脚本将文件保存在Google云端硬盘中。

function downloadAsXlsx() {

var spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 
var ssID = spreadSheet.getId();

Logger.log(ssID);

var url = "https://docs.google.com/spreadsheets/d/"+ssID+"/export?format=xlsx";   
var params = {method:"GET", headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}};
var response = UrlFetchApp.fetch(url, params);

// save to drive
DriveApp.createFile(response);

}

如果您将上述网址中的ssID替换为有效Google电子表格的实际文件ID,并将该网址复制并粘贴到浏览器中,则会自动下载活动电子表格"。这正是我需要添加到上面的脚本中的。

我的问题是如何更改和/或扩展上面的功能,以便将文件下载到默认下载文件夹中的本地计算机上?

1 个答案:

答案 0 :(得分:3)

您在问题中发布的代码正如您所注意到的那样,将Google电子表格的XLS版本导出到Google云端硬盘。如果您正在将Google云端硬盘同步到您的PC,那么您最终还是会在PC上获得一份副本......但这不是您所追求的。您想要一种触发Google表格的HTTP下载的方法,该表格使用系统对话框让您选择PC上保存下载文件的位置。

要实现此目标,我们无法使用服务器端Google Apps脚本技术,因为服务器无法访问您计算机的资源。相反,我们需要利用浏览器。由于您有兴趣通过“有效电子表格”执行此操作,因此使用自定义菜单项扩展Google电子表格的用户界面以提供包含下载链接的对话框是合乎逻辑的。

screenshot

显然需要很少的代码来支持这一点。这项工作由您的浏览器根据包含<a>anchor)标记的单行HTML完成。

/**
 * Adds a custom menu
 *
 * @param {Object} e The event parameter for a simple onOpen trigger.
 */
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createMenu('Custom')
      .addItem('Download as XLSX', 'downloadXLS_GUI')
      .addToUi();
}


/**
 * Display a modal dialog with a single download link.
 *
 * From: http://stackoverflow.com/a/37336778/1677912
 */
function downloadXLS_GUI() {
  // Get current spreadsheet's ID, place in download URL
  var ssID = SpreadsheetApp.getActive().getId();
  var URL = 'https://docs.google.com/spreadsheets/d/'+ssID+'/export?format=xlsx';

  // Display a modal dialog box with download link.
  var htmlOutput = HtmlService
                  .createHtmlOutput('<a href="'+URL+'">Click to download</a>')
                  .setSandboxMode(HtmlService.SandboxMode.IFRAME)
                  .setWidth(80)
                  .setHeight(60);
  SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Download XLS');
}