【问题标题】:Converting Google Spreadsheet to Excel with AppScript and send it via email使用 AppScript 将 Google 电子表格转换为 Excel 并通过电子邮件发送
【发布时间】:2015-09-02 15:10:18
【问题描述】:

我问了如何Convert Google Spreadsheet to excel with AppScript 2015

并被引导到另一个帖子https://stackoverflow.com/a/27281729/1677912中的答案

它似乎有效,但我遇到了一个新问题:创建的文件小于应有的大小,并且无法打开(损坏)。完整代码如下:

function crearBackUp() {

//pone en la variable -sheet- a la hoja activa
var sheet = SpreadsheetApp.getActiveSpreadsheet();

//obtiene la fecha para ponerle al nombre del archivo
var d = new Date();
var mes = d.getMonth() + 1;
var anio = d.getFullYear();

var nombre = "backUP_BaseDatos_BN_"+mes.toString()+anio.toString();

//creo una copia y obtengo el ID para pasarlo a Drive
var theBKP = sheet.copy(nombre);
var theID = theBKP.getId();

//Abro el arch con Drive y exporto a XLS
var file = Drive.Files.get(theID);
var url = file.exportLinks[MimeType.MICROSOFT_EXCEL];

var response = UrlFetchApp.fetch(url);      
var doc = response.getBlob();

//crea el archivo con DriveApp pasasndole el Blob
var theFile = DriveApp.createFile(doc).setName(file.title + '.xlsx');

//Manda el mail
MailApp.sendEmail('email@gmail.com', 'Subject','Mensaje',   {
  filename: nombre,
  attachments: theFile
  })
}

我想知道是否没有更简单或更直接的方法可以做到这一点,因为这对我来说是一个很好的解决方法。

【问题讨论】:

  • @Mogsdad 这里是完整代码

标签: javascript google-apps-script google-sheets


【解决方案1】:

您的代码中有一些奇怪的东西,例如复制工作表以生成 xls,或从 xls 创建驱动器文件以通过电子邮件发送,设置附件名称的方法错误等。

无论如何,当我尝试这段代码时,关键问题是 Drive Advanced Service 正在返回一个 html 而不是 excel 文件,并且查看这个 html 看起来像是一个授权页面。所以我认为我们需要将令牌提供给UrlFetch 以使其工作。

这是我的结果代码:

function crearBackUp() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();

  var d = new Date();
  var mes = d.getMonth() + 1;
  var anio = d.getFullYear();      
  var nombre = "backUP_BaseDatos_BN_"+mes.toString()+anio.toString();

  var file = Drive.Files.get(sheet.getId());
  var url = file.exportLinks[MimeType.MICROSOFT_EXCEL];

  var response = UrlFetchApp.fetch(url,
    {headers:{Authorization:"Bearer "+ScriptApp.getOAuthToken()}});
  var doc = response.getBlob();
  doc.setName(nombre+ '.xlsx');

  MailApp.sendEmail('example@gmail.com', 'Subject', 'Mensaje', {attachments:[doc]});
}

【讨论】:

  • 嗨,Henrique,我复制了该文件,因为我还需要在我的 GDrive 上复制(备份)。通过 Drive 创建文件是我从最后一个答案中获取的代码的一部分。我看到 Mogsdad 更新了它。好吧,它完美无缺!谢谢 Henrique 和 Mogsdad
  • 但是您需要驱动器、gsheet 备份、excel 还是两者兼而有之?因为您同时添加了两者.. @Rodrigo
  • 是的,你是对的,我只需要一份 gsheet 的副本.. 我的错误 =) @henrique
【解决方案2】:

Henrique 的回答已经很久了,exportLinks 不再起作用。出于这个原因,我留下了一个可以满足您需要的脚本。

function SendSheetAsXlsxAttach() {

  try {

    /*Get your Spreadsheet */
    var ss = SpreadsheetApp.openById("[YourSpreadsheetID]");

    /*Create URL to Export as xlsx */
    var url = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + ss.getId() + "&exportFormat=xlsx";

    var params = {
      method: "get",
      /*add authorization to get the file */
      headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
      muteHttpExceptions: true
    };

    /* with an http query get the blob file */
    var blob = UrlFetchApp.fetch(url, params).getBlob();

    /* sets the file extension */
    blob.setName(ss.getName() + ".xlsx");

    /* Send Mail with attachments */
    MailApp.sendEmail("[MailHere]", "Subject", "This mail contains .XLSX file attached", { attachments: [blob] });

  } catch (f) {
    Logger.log(f.toString());
  }

}

【讨论】:

    【解决方案3】:

    对于电子表格 ID,请使用以下内容:

    var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 2014-09-14
      • 2015-10-05
      • 1970-01-01
      相关资源
      最近更新 更多