如何遍历表格列,仅当状态为未发送时执行邮件发送?
问题解决:仅当状态未发送时发送邮件
你的代码存在几个关键问题导致状态判断失效,同时会重复发送邮件,以下是修正方案:
核心错误点
- 状态列索引错误:
status是单列范围(F列),getValues()返回的二维数组中每个row只有1个元素,你用row[6]会取到undefined,永远不等于"SENT",导致所有循环都执行发送。 - 邮箱未对应每行数据:你只获取了第2行的邮箱,循环中一直用这个固定邮箱发送,没有匹配每行的收件人。
- 数据获取效率低:单独取状态列不如一次性获取所有需要的列(邮箱、状态),减少Spreadsheet API调用。
修正后的完整代码
function emailPDF(pdf) { // 移除无用的调用 // DocumentApp.getActiveDocument(); // DriveApp.getFiles(); const ss = SpreadsheetApp.openByUrl("url"); const responseTab = ss.getSheetByName("Form responses 1"); const lastRow = responseTab.getLastRow(); // 一次性获取需要的列:B列(邮箱)、F列(状态),从第2行到最后一行 const data = responseTab.getRange(2, 2, lastRow - 1, 5).getValues(); // 范围是B2:F,共5列(B到F) const subject = 'Year Rota'; const body = "ROTA"; const url = 'url'; const exportOptions = 'exportFormat=pdf&format=pdf' + '&size=letter' + '&portrait=false' + '&fitw=true' + '&sheetnames=false&printtitle=false' + '&pagenumbers=false&gridlines=false' + '&fzr=false' + '&gid=1897395809'; const params = {method:"GET",headers:{"authorization":"Bearer "+ ScriptApp.getOAuthToken()}}; const pdfBlob = UrlFetchApp.fetch(url+exportOptions, params).getBlob(); data.forEach((row, index) => { const email = row[0] || ''; // B列是第1个元素(索引0) const status = row[4] || ''; // F列是B到F的第5个元素(索引4) // 仅当状态不是"SENT"且邮箱不为空时发送 if (status !== "SENT" && email) { GmailApp.sendEmail(email, subject, body, { htmlBody: body, attachments: [{ fileName: "ROTA.pdf", content: pdfBlob.getBytes(), mimeType: "application/pdf" }] }); // 更新对应行的状态为"SENT",F列是第6列(索引5,因为从1开始) responseTab.getRange(index + 2, 6).setValue('SENT'); } }); }
关键修改说明
- 修正状态索引:
row[4]对应F列(因为我们取的是B到F的范围,F是第5列,索引从0开始)。 - 每行匹配邮箱:从
data数组中获取当前行的邮箱,确保每个收件人对应自己的状态。 - 增加邮箱非空判断:避免向空邮箱发送邮件。
- 移除无用代码:删除
DocumentApp.getActiveDocument()和DriveApp.getFiles()这类无意义的调用。 - 变量命名优化:将
response改为pdfBlob,更清晰表达变量用途。
内容的提问来源于stack exchange,提问作者Arnoldas
相关产品推荐
相关产品推荐

