【问题标题】:Mail Merge on Google Sheets and Apps ScriptGoogle 表格和 Apps 脚本上的邮件合并
【发布时间】:2020-11-29 15:48:26
【问题描述】:

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

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

【问题讨论】:

    标签: google-apps-script google-sheets gmail-api mailmerge


    【解决方案1】:

    我相信你的目标如下。

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

    修改点:

    • 首先,关于MATCH,第三个参数的默认值为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. 创建用于转换为 PDF 数据的工作表。
        • 这部分在循环中运行。
          1. 复制工作表PDF作为模板。
          2. 在“C6”单元格中设置名称。
          3. 将模板表导出为 PDF 数据。
          4. 使用“C6”名称对应的邮箱发送邮件。
          5. 删除模板表。

    修改脚本:

    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);
      });
    }
    

    参考资料:

    【讨论】:

    • 绝妙的解决方案,我从没想过创建临时表来实现它并遍历列表。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多