谷歌脚本电子邮件范围为pdf附件

时间:2018-01-24 00:42:27

标签: google-apps-script

大家!

我写这个作为最后的手段 - 我已经把我所有的头发都撕掉了,现在我没有留下任何头发,我还需要做别的事。

我需要发送一系列Google表格作为电子邮件的pdf附件。收件人地址(以逗号分隔)位于不同工作表的单元格中。

我从哪里开始? (我应该从高级Gmail服务还是Class MailApp开始?为什么?)

Google文档告诉我,我需要一些东西:

  1. sendto recipent(s)地址,以逗号分隔(DONE! - 地址位于特定单元格中,位于同一工作簿中的单独工作表中)
  2. 邮件正文(完成! - 可以硬编码到脚本中)
  3. 回复地址(完成! - 可以硬编码到脚本中)
  4. pdf附件(将所需的单元格范围转换为pdf)
  5. 注意:如果我无法指定范围,并且只能将整个工作表转换为pdf,我以前必须将我需要发送的单元格范围导出到另一个项目的单独工作表中,并且可以与之合作。 (如果需要,我可以再次设置另一张表......)

    我不知道我需要怎么做才能做到这一点,因为我在编码方面是一个菜鸟。我不需要有人为我编写脚本 - 我可以这样做。

    我应该从哪里开始?

    (是的,我已经多次阅读过Google脚本文档。)

2 个答案:

答案 0 :(得分:0)

我现在正在工作,并通过手机发帖,因此回复有限。

我发现(并且无耻地复制)我在网上找到的似乎完成工作的代码(几乎无休止地运行并重新运行脚本之后)。我打算今晚晚些时候发布代码。

仍然存在一个问题:Google工作表上的大量数据是由VLOOKUP公式生成的。 VLOOKUPs生成的数据似乎没有与表格的其余部分一起转换 - 我收到#REF错误。如果我将VLOOKUP更改为INDEX MATCH,我会得到#NA。有解决方案或解决方法吗?

答案 1 :(得分:0)

我现在正在工作,并通过手机发帖,因此回复有限。

我发现(并且无耻地复制)我在网上找到的似乎完成工作的代码(几乎无休止地运行并重新运行脚本之后)。我打算今晚晚些时候发布代码。

仍然存在一个问题:Google工作表上的大量数据是由VLOOKUP公式生成的。此数据不会与工作表的其余部分一起转换。使用VLOOKUP将数据拉入工作表是#REF错误,INDEX MATCH公式返回#NA错误。有解决方案或解决方法吗?

无论如何,代码如下:

    function exportSomeSheets() {

// FOR WK1 ONLY!!!


  // Set the Active Spreadsheet so we don't forget
  var originalSpreadsheet = SpreadsheetApp.getActive();

  // Set the message to attach to the email.
  var message = "Please see attached.";

  // Get Dates from Email!B5
  var period = originalSpreadsheet.getRange("Email!B5").getValues();

  // Construct the Subject Line
  var subject = period;

  // Get contact details from "Email" sheet and construct To: Header
  var contacts = originalSpreadsheet.getSheetByName("Email");
  var numRows = contacts.getLastRow();
  var emailTo = contacts.getRange(17, 2, numRows, 1).getValues();

  // Google scripts can't export just one Sheet from a Spreadsheet
  // So we have this disgusting hack

  // Create a new Spreadsheet and copy the current sheet into it.
  var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export");
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var projectname = SpreadsheetApp.getActiveSpreadsheet();
  sheet = originalSpreadsheet.getActiveSheet();
  sheet.copyTo(newSpreadsheet);

  // Find and delete the default "Sheet1", after the copy to avoid triggering an apocalypse
  newSpreadsheet.getSheetByName('Sheet1').activate();
  newSpreadsheet.deleteActiveSheet();

  // Create the PDF, currently called "Tracking Sheet.pdf"
  var pdf = DriveApp.getFileById(newSpreadsheet.getId()).getAs('application/pdf').getBytes();
  var attach = {fileName:'Tracking Sheet.pdf',content:pdf, mimeType:'application/pdf'};

  // Send the freshly constructed email 
  MailApp.sendEmail(emailTo, subject, message, {attachments:[attach]});

  // Delete the wasted sheet we created, so our Drive stays tidy.
  DriveApp.getFileById(newSpreadsheet.getId()).setTrashed(true);

}