Google 表格和 Apps 脚本上的邮件合并

Mail Merge on Google Sheets and Apps Script

我目前有一个脚本,它将获取特定的 sheet 并将其作为 PDF 发送到单元格 C8 上的电子邮件地址,当前通过在下拉列表中选择一个名称来填充此单元格,就像我们一样用它来发送收据,有没有办法循环脚本并发送带有各自副本的自动电子邮件?我已经尝试使用 for 语句,但到目前为止没有成功。在我的代码下方(它运行良好,但仅适用于一封电子邮件)和一个 spreadsheet 示例。关于如何实现这一点有什么想法吗?

function emailSpreadsheetAsPDF() {

var emailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PDF").getRange("C8");

    var email = emailRange.getValues();

    var ss = SpreadsheetApp.getActiveSpreadsheet();

    var sheet = ss.getSheetByName("PDF"); // Enter the name of the sheet here

    var subject = "Test Receipt ";

    var body = "\n Please see attached your current test receipt: ";

    // Base URL
    var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ss.getId());

    /* Specify PDF export parameters
    From: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579
     */

    var url_ext = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
         + '&size=letter' // paper size legal / letter / A4
         + '&portrait=true' // orientation, false for landscape
         + '&fitw=true&source=labnol' // fit to page width, false for actual size
         + '&sheetnames=false&printtitle=false' // hide optional headers and footers
         + '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
         + '&fzr=false' // do not repeat row headers (frozen rows) on each page
         + '&gid='; // the sheet's Id

    var token = ScriptApp.getOAuthToken();

    var response = UrlFetchApp.fetch(url + url_ext + sheet.getSheetId(), {
            headers : {
                'Authorization' : 'Bearer ' + token
            }
        }).getBlob().setName(sheet.getName() + ".pdf");

    // Uncomment the line below to save the PDF to the root of your drive. 
    //  var newFile = DriveApp.createFile(response).setName(sheet.getName() + ".pdf")

    if (MailApp.getRemainingDailyQuota() > 0)
        GmailApp.sendEmail(email, subject, body, {
            htmlBody : body,
            attachments : [response]
        });
        }

https://docs.google.com/spreadsheets/d/1p4p9A9z8-EqlFGnlJ1o360gA8lcp-L29iuIPNylC4e8/edit?usp=sharing

我相信你的目标如下。

  • 您想通过更改 sheet PDF 中单元格“C6”的名称来发送电子邮件。
  • 您想使用 Google Apps 脚本实现此目的。

修改点:

  • 首先,关于MATCH,第3个参数的默认值为1。因此,在您的情况下,需要设置 0 。所以请修改“C8”、“E17”、“E19”、“E21”的公式如下

    • C8: =INDEX(Sheet2!B3:B,MATCH(C6,Sheet2!A3:A,0))
    • E17: =INDEX(Sheet2!C3:C,MATCH(C6,Sheet2!A3:A,0))
    • E19: =INDEX(Sheet2!D3:D,MATCH(C6,Sheet2!A3:A,0))
    • E21: =INDEX(Sheet2!E3:E,MATCH(C6,Sheet2!A3:A,0))
  • 对于你的情况,我认为有几种方法。所以在这个回答中,我想提出以下流程。

    1. 从“Sheet2”中检索值。
    2. 创建 sheet 用于转换为 PDF 数据。
      • 这部分在循环中运行。
        1. 复制sheetPDF作为模板。
        2. 在单元格“C6”中设置名称。
        3. 将模板 sheet 导出为 PDF 数据。
        4. 使用名字“C6”对应的邮箱发送邮件。
        5. 删除模板sheet。

修改后的脚本:

function myFunction() {
  // 1. Retrieve values from "Sheet2".
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet2");
  var values = sheet.getRange("A3:A" + sheet.getLastRow()).getValues();
  var template =  ss.getSheetByName("PDF");
  var ssId = ss.getId();
  var token = ScriptApp.getOAuthToken();
  var filenameOfPdf = template.getSheetName();
  
  // 2. Create sheets for converting to PDF data.
  values.forEach(([v], i) => {
    // 1. Copy the sheet `PDF` as the template.
    var temp = template.copyTo(ss).setName("temp" + (i + 1));
    
    // 2. Set the name at the cell "C6".
    temp.getRange("C6").setValue(v);
    SpreadsheetApp.flush();
    var email = temp.getRange("C8").getValue();
    
    // 3. Export the template sheet as the PDF data.
    var subject = "Test Receipt ";
    var body = "\n Please see attached your current test receipt: ";
    var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ssId);
    var url_ext = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
    + '&size=letter' // paper size legal / letter / A4
    + '&portrait=true' // orientation, false for landscape
    + '&fitw=true&source=labnol' // fit to page width, false for actual size
    + '&sheetnames=false&printtitle=false' // hide optional headers and footers
    + '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
    + '&fzr=false' // do not repeat row headers (frozen rows) on each page
    + '&gid='; // the sheet's Id
    var response = UrlFetchApp.fetch(url + url_ext + temp.getSheetId(), {headers : {'Authorization' : 'Bearer ' + token}}).getBlob().setName(filenameOfPdf + ".pdf");
    
    // 4. Send an email using the email corresponding to the name of "C6".
    if (MailApp.getRemainingDailyQuota() > 0)
    GmailApp.sendEmail(email, subject, body, {htmlBody : body,attachments : [response]});
    
    // 5. Delete the template sheet.
    ss.deleteSheet(temp);
  });
}

参考文献: