【问题标题】:Efficient Way of sending Spreadsheet over email using GAS function?使用 GAS 功能通过电子邮件发送电子表格的有效方式?
【发布时间】:2019-06-26 14:07:29
【问题描述】:

我正在为 Google 表格创建一个插件,我当地的高中志愿者俱乐部可以使用它来跟踪其成员的志愿者时间。大多数代码已经完成并且运行良好,我目前正在开发一个系统,该系统将向成员发送一个电子表格,其中列出了他们记录的所有志愿者事件。我让 GAS 创建了一个单独的电子表格,然后发送一封电子邮件,其中包含以 PDF 格式附加的单独电子表格。收到电子邮件后,除了页面左上角的单个空单元格外,PDF 为空。

我对 GAS 很陌生,但能够很容易地掌握内容。我只尝试了一种发送电子表格的方法,那就是使用 .getAs(MimeType.PDF)。当我将“PDF”更改为“GOOGLE_SHEETS”时,GAS 返回错误:“Blob 对象必须具有此操作的非空数据。”我不完全确定 Blob 对象是什么,也没有找到任何网站或视频对其进行了充分解释,因此我不确定如何解决该错误。

我认为我在获取文件时遇到了问题,因为它要么发送一个空 PDF,要么返回一个错误,声称它需要“非空数据”。

function TigerMail()
{
  var Drive = DriveApp;
  var app = SpreadsheetApp;
  var LOOKUP = app.getActiveSpreadsheet().getSheetByName("Student 
  Lookup");
  var Name = LOOKUP.getRange("E1").getValue();
  Name = Name + "'s Hours";
  //app.openById(Name+"'s Hours");
  var HOURS = app.create(Name);
  var ESheet = HOURS.getSheets()[0];
  var ROW = LOOKUP.getLastRow();
  var arr = LOOKUP.getRange("D1:J"+ROW).getValues();
  var cell = ESheet.getRange("A1:G"+ROW);
  cell.setValues(arr);

////////////////////////////////////////////////////

  var LOOKUP = app.getActiveSpreadsheet().getSheetByName("Student 
  Lookup");
  var cell = LOOKUP.getRange("D1");  
  var Addr = cell.getValue();
  var ROW = LOOKUP.getLastRow();
  var file = Drive.getFilesByName(Name);
  var file = file.next();
  var FORMAT = file.getAs(MimeType.GOOGLE_SHEETS);

  TigerMail.sendEmail(Addr, "Hours", "Attached is a list of all of the 
  events you have volunteered at:", {attachments: [FORMAT]} );
}

最后四行是错误发生的地方。我相信我误解了 .next() 和 .getFilesByName() 的工作方式。

(注释行上方:创建小时电子表格)

(在评论行下方:抓取电子表格并将其附加到电子邮件中)

以下是 Google 表格的链接: https://docs.google.com/spreadsheets/d/1qlUfTWaj-VyBD2M45F63BtHaqF0UOVkwi04XwZFJ4vg/edit?usp=sharing

【问题讨论】:

  • 嗨,我曾经尝试将文件添加为附件时遇到了类似的问题,我的解决方案是将 url 添加到电子邮件的正文中,您可以通过将 sendEmail 调用更改为:@ 987654323@ 驱动器 URL 链接为电子邮件正文中的附件,在您的情况下,它将作为电子表格发送

标签: google-apps-script google-sheets


【解决方案1】:
  • 在您的脚本中,将创建新的电子表格并输入值。
  • 您希望通过附加从创建的电子表格转换为 PDF 格式的文件来发送电子邮件。

如果我的理解是正确的,那么这个修改呢?请认为这只是几个答案之一。

修改点:

  • 关于Drive.getFilesByName(Name),可惜Drive中没有getFilesByName()的方法。
    • 我认为当你想使用创建的电子表格时,可以使用var HOURS = app.create(Name)HOURS
  • 关于var FORMAT = file.getAs(MimeType.GOOGLE_SHEETS),对于Google Docs,当检索到blob时,blob会自动转换为PDF格式。这也可以用于您的情况。
  • 为了保存放入创建的电子表格的值,它使用SpreadsheetApp.flush()

当以上几点反映到你的脚本中时,它变成如下。

修改脚本:

请进行如下修改。

从:
var file = Drive.getFilesByName(Name);
var file = file.next();
var FORMAT = file.getAs(MimeType.GOOGLE_SHEETS);
至:
SpreadsheetApp.flush();
var FORMAT = HOURS.getBlob();

注意:

  • 在您的脚本中,似乎没有使用var ROW = LOOKUP.getLastRow()

参考资料:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

【讨论】:

    猜你喜欢
    • 2012-02-07
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多