【问题标题】:Google Apps Script for sending email contains multiple rows data用于发送电子邮件的 Google Apps 脚本包含多行数据
【发布时间】:2021-07-28 20:44:10
【问题描述】:

我有一个类似的数据

Screenshot of data

我想从 appscript 发送电子邮件。

发送邮件的逻辑如下。

仅向 A 列(共同名称)中的每个唯一值发送 1 封电子邮件,电子邮件的内容将包含所有行中的数据。仅发送 N 列值为“Y”的电子邮件。例如,

脚本只会发送 3 封电子邮件:

电子邮件 1: 提醒一下“HCMC 1”的以下房屋租赁合同已经到期。

  • A 先生 - 房屋租约将于 2021 年 7 月 11 日到期
  • B 先生 - 房屋租约将于 2021 年 7 月 11 日到期

电子邮件 2: 特此提醒,“HCMC 4”以下房屋租赁合同已到期。

  • C 先生 - 房屋租约将于 2021 年 7 月 11 日到期

电子邮件 3: 特此提醒,以下“HCMC 5”房屋租赁合同已到期。

  • D 先生 - 房屋租约将于 2021 年 7 月 11 日到期

我使用这个脚本。但是,它不能发送包含多行数据的电子邮件。它发送 4 封电子邮件而不是 3 封。请帮助我。谢谢。

function HLReminderAtYE(){
var SS = SpreadsheetApp.getActiveSpreadsheet();  //declare the spreadsheet
var Sheet = SS.getSheetByName("Tax_Master");  //declare sheet name
var Range = Sheet.getDataRange(); //to set the range as array
var Values = Range.getDisplayValues(); //to get the value in the array  

let fvs = Values.filter(function (item) { return item[13] == "Y" }); // filter only housecontract to remind at year end
  
var templateText = SS.getSheetByName("Template").getRange(1,1).getValue();

fvs.forEach(function(row){
    
  var AssigneeNames = row[1];
  var ClientNames = row[0];
  var HLEndDates = row[7];
  var messageBody = templateText.replace("{ClientNames}",ClientNames).replace("{AssigneeNames}",AssigneeNames).replace("{HouseleaseEndDates}",HLEndDates);
    
  MailApp.sendEmail(
    row[12],          // email address
    row[0] + "- House lease contract expire", // Subject line
    messageBody);
  });
}

【问题讨论】:

  • @Cooper 你在吗? :)
  • 您的循环遍历设置了提醒标志的每一行。您有 4 行,产生 4 封电子邮件。您应该首先在一个数组中收集所有唯一的“共同名称”,遍历该数组并找到当前“共同名称”的对应行并将其放入电子邮件中。
  • 使用对象为您希望的每个受让人或客户创建属性,并收集每个键的行数组以及将所有属性列为数组的属性数组。完成集合后,您可以遍历您的属性数组,以向您之前选择的受让人或客户发送单个电子邮件。我使用 Object.hasOwnProperty() 方法来确定属性是否已经创建。这与创建数据透视表或反向数据透视表的想法相同。
  • 非常感谢您的帮助。 Aerials 的答案是我的问题的解决方案。

标签: google-apps-script


【解决方案1】:

我制作了以下租约示例表,标题为:

["owner","leaser","owner's email address","Y/N"]

向你展示这个想法。

以下示例显示如何按“所有者”对“Y”租约进行分组,并仅向“所有者的电子邮件地址”发送一封电子邮件,其中包含所有已过期的“租用者”(带有“Y”的行)。

示例:

function HLReminderAtYE() {
    let SS = SpreadsheetApp.getActiveSpreadsheet(); //declare the spreadsheet
    let Sheet = SS.getSheetByName("Sheet1"); //declare sheet name
    let Range = Sheet.getDataRange(); //to set the range as array
    let Values = Range.getDisplayValues(); //to get the value in the array  

    // Get all rows with a "Y" to send email
    let fvs = Values.filter((item) => {
        if (item[3] == "Y") return item
    });
    // Create an object grouped by owner
    fvs = fvs.map(
        (row) => {
            return {
                'name': row[0],
                'data': row.slice(1, 3)
            }
        }
    );
    console.log(fvs);
    fvs = fvs.reduce((r, a) => {
        r[a.name] = r[a.name] || [];
        r[a.name].push(a.data);
        return r;
    }, Object.create(null));
    let templateText = "{ClientNames} House lease contract expired.\n";

    Object.keys(fvs).forEach((key) => {
        let messageBody = ''
        fvs[key].forEach((row) => {
            let ClientNames = row[0];
            messageBody += templateText.replace("{ClientNames}", ClientNames);
        });


        // Send email
        MailApp.sendEmail(
            fvs[key][0][1], // owner's email address
            "House leases contract expired", // Subject line
            messageBody);

    });
}

参考:

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 2014-08-05
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2013-08-15
    • 2023-02-07
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多