Google Apps Script提取表格数据问题:漏取最后行及多邮箱存储咨询
Google Sheets自动发邮件脚本问题解决方案
问题1:数据提取缺失最后一行修复
根因
在单元格写入UNIQUE公式后立即读取工作表最后一行,此时Google Sheets公式为异步计算,还未返回完整结果,导致获取到的行数比实际少1,最后一行数据未被遍历。
修复代码
在UNIQUE公式写入语句后添加强制刷新语句,等待计算完成后再读取行数:
cs.getRange('A2').setFormula('=UNIQUE(Sheet1!G2:G' + mainSheetLastRow + ')'); // 新增以下行,强制等待公式计算完成 SpreadsheetApp.flush(); var custNameLastRow = cs.getLastRow();
问题2:多邮箱存储方案选择
两种方案均可正常实现需求,差异如下:
- 方案1(同客户多邮箱分两行存储):无需修改现有代码逻辑,遍历到同一客户的多行邮箱时会自动分别发送邮件,不需要处理分隔符转义问题,容错率更高,更推荐使用。
- 方案2(同一单元格用分号分隔多邮箱):表格结构更简洁,仅需修改读取邮箱的代码,将分号替换为逗号即可(MailApp原生支持逗号分隔的多个收件人):
// 原代码 // emailAddress = ts.getRange('B' + l).getValue(); // 修改为 emailAddress = ts.getRange('B' + l).getValue().replace(/\s*;\s*/g, ',');
完整修改后代码(默认使用方案1逻辑)
function myFunction() { vs = SpreadsheetApp.getActiveSpreadsheet(); var i; var j; var k; var l; var name; var dsCustName; var custSheetLastRow; var emailAddress; var emailSubject; var emailMessage; var emailName; ds = vs.getSheets()[0]; var mainSheetLastRow = ds.getLastRow(); var shtName = ds.getName(); Logger.log(shtName); var date = Utilities.formatDate(new Date(), "GMT-5:30", "dd/MM/yyyy"); var custNameDate = new Date(); ts = vs.getSheetByName('Email'); cs = vs.insertSheet('Customer Name' + date); cs.getRange('A1').setValue('Customer Names'); cs.setColumnWidth(1, 250); cs.getRange('A2').setFormula('=UNIQUE(Sheet1!G2:G' + mainSheetLastRow + ')'); // 新增强制刷新行 SpreadsheetApp.flush(); var custNameLastRow = cs.getLastRow(); for (i = 2; i <= custNameLastRow; i++) { name = cs.getRange('A' + i).getValue(); vvs = SpreadsheetApp.create(name + custNameDate); dds = vvs.getActiveSheet(); var dataToCopy = ds.getRange('A1:J' + mainSheetLastRow); var lastRow = dds.getLastRow(); for (k = 1; k <= 9; k++) { var Paste = dds.getRange(lastRow + 1, k).setValues(dataToCopy.getCell(1, k).getValues()); } for (var j = 1; j <= mainSheetLastRow; j++) { var dataToCopy = ds.getRange('A1:J' + mainSheetLastRow); var lastRow = dds.getLastRow(); dsCustName = ds.getRange('G' + j).getValue(); if (name == dsCustName) { for (k = 1; k <= 9; k++) { var Paste = dds.getRange(lastRow + 1, k).setValues(dataToCopy.getCell(j, k).getValues()); } } } var emailLastRow = ts.getLastRow(); for (l = 2; l <= emailLastRow; l++) { emailName = ts.getRange('A' + l).getValue(); emailAddress = ts.getRange('B' + l).getValue(); emailSubject = ts.getRange('C' + l).getValue(); emailMessage = ts.getRange('D' + l).getValue(); if (name == emailName) { try { var url = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + vvs.getId() + "&exportFormat=xlsx"; var params = { method: "get", headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, muteHttpExceptions: true }; var blob = UrlFetchApp.fetch(url, params).getBlob(); blob.setName(dds.getName() + ".xlsx"); MailApp.sendEmail(emailAddress, emailSubject, emailMessage, { attachments: [blob] }); } catch (f) { Logger.log(f.toString()); } } } var files = DriveApp.getFilesByName(name + custNameDate); while (files.hasNext()) { var file = files.next(); file.setTrashed(true); } } cs.activate(); vs.deleteActiveSheet(); }
内容的提问来源于stack exchange,提问作者Osseios
相关产品推荐
相关产品推荐

