求助:使用循环构建MailApp邮件消息内容(替代手动拼接)
解决自动构建邮件消息的循环问题
嘿,我来帮你搞定这个循环生成邮件内容的问题!你现在手动拼接message的方式在数组元素变多后确实会失效,核心问题是要通过循环(或者更简洁的数组方法)自动把所有符合条件的PalletNo和SOH按格式拼起来,而不是手动写每个元素。
问题原因
你之前尝试在message变量或MailApp.sendEmail里直接加循环出现语法问题,是因为这两个地方都需要的是字符串类型的值,不能直接把循环逻辑写进去——得先通过循环生成完整的字符串,再把这个字符串传进去。
解决方案
这里给你两种可行的方式,你可以选自己习惯的:
方式1:传统for循环构建消息
先初始化空字符串,然后遍历数组把每一行内容拼进去:
// 初始化空消息 var message = ""; // 遍历PalletNo数组(两个数组长度一致,用哪个的length都可以) for (var k = 0; k < PalletNo.length; k++) { // 按要求的格式拼接每一行,加换行符\n message += PalletNo[k] + " (x" + SOH[k] + ")\n"; }
方式2:用数组map+join(更简洁,推荐)
利用数组的map方法把每个元素转换成目标格式的字符串,再用join("\n")把所有字符串连起来,一行代码搞定:
// ES5写法(兼容所有环境) var message = PalletNo.map(function(pallet, index) { return pallet + " (x" + SOH[index] + ")"; }).join("\n"); // ES6箭头函数写法(更简洁,现在Google Apps Script已支持) var message = PalletNo.map((pallet, index) => `${pallet} (x${SOH[index]})`).join("\n");
修改后的完整代码
我还帮你做了一些小优化(比如简化数组初始化、去掉无用的else块),完整代码如下:
function LowT4KANBANSOHEmail() { var ss = SpreadsheetApp.getActive(); var sheet = ss.getSheetByName('T4 Pallet (SOH) (Power Bi)'); var now = new Date(); var startRow = 1; var numRows = sheet.getLastRow(); var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn()); var data = dataRange.getValues(); var j = 0; var PalletNo = []; // 更简洁的数组初始化方式 var SOH = []; for (var i = 0; i < data.length; ++i) { var row = data[i]; var TotalSOH = row[3]; var MinSOH = row[4]; if (TotalSOH <= MinSOH){ PalletNo[j] = row[0]; SOH[j] = row[3]; j++; // 简化自增写法 } }//End of for loop // 这里选你喜欢的方式构建message var message = PalletNo.map((pallet, index) => `${pallet} (x${SOH[index]})`).join("\n"); MailApp.sendEmail("emailaddress", "Subject", message ); }//End of function
这样不管你的数组有多少个元素,都会自动按PalletNo[j] (xSOH[j])的格式每行显示,完全不用手动修改拼接代码啦!
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

