如何修改Google Apps Script实现Google Sheet多行选中时批量发邮件?
解决Google Apps Script批量发送邮件问题
你的脚本当前仅处理选中区域内最后一个单元格所在的单行,所以选中多行或多单元格时只会发送最后一行的邮件。以下是修改后的代码,支持批量处理选中的所有行:
function sendEmail() { const ss = SpreadsheetApp.getActive(); const ui = SpreadsheetApp.getUi(); const lsh = ss.getSheetByName('List'); const tsh = ss.getSheetByName('Template'); const subject = tsh.getRange(2, 1).getValue(); const messageTemplate = tsh.getRange(2, 2).getValue(); const dt = new Date(); // 获取选中的范围并提取所有唯一行号 const selectedRange = lsh.getActiveRange(); const startRow = selectedRange.getRow(); const numRows = selectedRange.getNumRows(); // 用Set去重,避免同一行选多个单元格重复处理 const uniqueRows = new Set(); for (let i = 0; i < numRows; i++) { uniqueRows.add(startRow + i); } // 如果没有选中有效行,提示 if (uniqueRows.size === 0) { ui.alert("请选择包含面试官信息的行"); return; } // 循环处理每一行 for (const row of uniqueRows) { // 检查当前行是否为空(以A列为准) if (lsh.getRange(row, 1).isBlank()) { ui.alert(`第${row}行无面试官信息,已跳过`); continue; } // 获取当前行的数据 const rowData = lsh.getRange(row, 1, 1, 5).getValues()[0]; const firstName = rowData[0]; const lastName = rowData[1]; const email = rowData[2]; const authorName = rowData[3]; const bookTitle = rowData[4]; // 替换模板变量 let message = messageTemplate.replace("<firstName>", firstName) .replace("<authorName>", authorName) .replace("<bookTitle>", bookTitle); // 发送邮件 MailApp.sendEmail(email, subject, message); // 更新发送状态 lsh.getRange(row, 6).setValue(dt); lsh.getRange(row, 7).setValue("Sent"); // 提示当前行发送成功(可选,批量时可以注释掉避免频繁弹窗) // ui.alert(`面试官:${firstName} ${lastName}\n邮箱:${email}\n作者:${authorName}\n书名:${bookTitle}\n发送成功!`); } ui.alert(`批量发送完成,共处理${uniqueRows.size}行`); }
关键修改说明:
- 获取选中的所有行:通过
getActiveRange()获取完整选中区域,计算出包含的所有行号,并用Set去重,确保同一行即使选中多个单元格也只处理一次。 - 循环处理逻辑:遍历每个唯一行号,对每一行执行数据读取、模板替换、邮件发送和状态更新的完整流程。
- 空白行检查:针对每一行单独检查是否为空,避免无效行导致错误,同时提示跳过的行。
- 模板预加载:提前读取邮件模板内容,避免循环中重复调用
getRange(),提升脚本执行效率。 - 批量完成提示:所有行处理完成后统一提示,替代原来的单行弹窗,更适合批量操作。
内容的提问来源于stack exchange,提问作者Tolga
相关产品推荐
相关产品推荐

