Google应用脚本:将电子表格通过电子邮件发送为excel

时间:2015-08-04 12:57:16

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

如何创建一个将电子表格作为Excel文件附加的应用脚本,并将其通过电子邮件发送到某个电子邮件地址?

Stackoverflow上有一些关于如何执行此操作的较旧帖子,但它们现在似乎已过时且似乎有效。

谢谢。

2 个答案:

答案 0 :(得分:5)

看起来@Christiaan Westerbeek的回答是现实的,但自从他的帖子开始已经过去了一年,我认为他上面提到的剧本需要进行一些修改。

var url = file.exportLinks[MimeType.MICROSOFT_EXCEL];

这行代码有问题,可能exportLinks现已折旧。当我执行他的代码时,它给出了以下效果的错误:

  

TypeError:无法从undefined中读取属性“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”。

解决方法如下:

上面一行代码中的网址基本上是“下载为xlsx”网址,可用于直接将电子表格下载为您从File> Download as > Microsoft Excel (.xlsx)获取的xlsx文件

格式为:

  

https://docs.google.com/spreadsheets/d/<<<ID>>>/export?format=xlsx&id=<<<ID>>>   其中&lt;&lt;&gt;&gt;应该替换为您的文件的ID。

选中here,轻松了解如何从Google工作表的网址中提取ID。

答案 1 :(得分:3)

这是一个最新的工作版本。此Google Apps脚本工作的一个先决条件是必须启用Drive API v2 Advanced Google Service。通过资源 - &gt;在您的Google Apps脚本中启用它高级Google服务... - &gt; Drive API v2 - &gt;上。然后,该窗口将告诉您,您必须在Google Developers Console中启用此服务。点击链接并在那里启用服务!完成后,只需使用此脚本。

/**
 * Thanks to a few answers that helped me build this script
 * Explaining the Advanced Drive Service must be enabled: http://stackoverflow.com/a/27281729/1385429
 * Explaining how to convert to a blob: http://ctrlq.org/code/20009-convert-google-documents
 * Explaining how to convert to zip and to send the email: http://ctrlq.org/code/19869-email-google-spreadsheets-pdf
 * New way to set the url to download from by @tera
 */
function emailAsExcel(config) {
  if (!config || !config.to || !config.subject || !config.body) {
    throw new Error('Configure "to", "subject" and "body" in an object as the first parameter');
  }

  var spreadsheet   = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = spreadsheet.getId()
  var file          = Drive.Files.get(spreadsheetId);
  var url           = 'https://docs.google.com/spreadsheets/d/'+spreadsheetId+'/export?format=xlsx';
  var token         = ScriptApp.getOAuthToken();
  var response      = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' +  token
    }
  });

  var fileName = (config.fileName || spreadsheet.getName()) + '.xlsx';
  var blobs   = [response.getBlob().setName(fileName)];
  if (config.zip) {
    blobs = [Utilities.zip(blobs).setName(fileName + '.zip')];
  }

  GmailApp.sendEmail(
    config.to,
    config.subject,
    config.body,
    {
      attachments: blobs
    }
  );
}

更新:我更新了设置要下载的网址的方式。通过file.exportLinks集合执行它不再有效。感谢@tera在他的回答中指出了这一点。