Google Apps Script发送邮件无法合并同公司多行数据问题求助
解决方法
你当前脚本重复发信的核心原因是直接遍历所有符合条件的行、每行触发一次发信逻辑,没有做同公司数据的聚合。你可以先按公司名称对过滤后的数据做分组,每个公司仅触发一次发信,合并该公司下的所有对应条目到邮件内容中即可。
修改后的完整代码如下:
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" }); // 过滤N列为Y的条目 var templateText = SS.getSheetByName("Template").getRange(1,1).getValue(); // 新增:按公司名称分组聚合数据 const companyGroups = {}; fvs.forEach(row => { const companyName = row[0]; // 公司首次出现时初始化分组结构 if(!companyGroups[companyName]){ companyGroups[companyName] = { receiveEmail: row[12], contractList: [] } } // 把当前行的租约信息存入对应公司的分组 companyGroups[companyName].contractList.push({ assigneeName: row[1], endDate: row[7] }) }) // 遍历每个公司分组发信 Object.keys(companyGroups).forEach(company => { const group = companyGroups[company]; // 把同一公司的多条租约信息拼接成列表,纯文本用\n换行,HTML模板可以换成<br/>或<li>标签 let assigneeStr = ""; let dateStr = ""; group.contractList.forEach((item, index) => { const split = index === group.contractList.length -1 ? "" : "\n"; assigneeStr += item.assigneeName + split; dateStr += item.endDate + split; }) // 替换模板变量 var messageBody = templateText.replace("{ClientNames}",company) .replace("{AssigneeNames}",assigneeStr) .replace("{HouseleaseEndDates}",dateStr); // 发信 MailApp.sendEmail( group.receiveEmail, // 对应公司的收件邮箱 company + "- House lease contract expire", // 主题 messageBody ); }) }
注意:如果你的邮件模板是HTML格式,可以把拼接时的换行符\n替换为<br>或者有序/无序列表标签,排版效果会更好。
内容的提问来源于stack exchange,提问作者Tuong Vy Tran
相关产品推荐
相关产品推荐

