使用GAS功能通过电子邮件发送电子表格的有效方法?

时间:2019-06-26 03:53:43

标签: google-apps-script google-sheets

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

我对GAS并不陌生,但是能够轻松掌握内容。我只尝试了一种发送电子表格的方法,那就是使用.getAs(MimeType.PDF)。当我将“ PDF”更改为“ GOOGLE_SHEETS”时,GAS返回了错误:“此操作的对象必须具有非空数据”。我不能完全确定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

1 个答案:

答案 0 :(得分:1)

  • 在脚本中,将创建新的电子表格并放置值。
  • 您要通过将已创建的电子表格转换为PDF格式的文件附加电子邮件来发送电子邮件。

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

修改点:

  • 很遗憾,关于Drive.getFilesByName(Name)getFilesByName()中没有Drive的方法。
    • 我认为,当您要使用创建的电子表格时,可以使用HOURS中的var HOURS = app.create(Name)
  • 关于var FORMAT = file.getAs(MimeType.GOOGLE_SHEETS),如果是Google文档,则在检索到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()

参考文献:

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