javascript - 获取 Google Emailer 脚本以针对一组特定的选项卡运行
问题描述
我有一个电子邮件脚本,我想为指定的选项卡运行该脚本,并确保它跳过任何具有空白值的行,因为它目前似乎在遇到空白行时就会崩溃。
我已经成功构建了适用于一个选项卡的脚本,但是一旦我尝试让它适用于多个选项卡,它似乎就崩溃了。
function reminders() {
var ss = SpreadsheetApp.openById("SHEET-ID");
var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName(("sheet_1","sheet_2","sheet_3")));
var editedCell = sheet.getActiveRange().getColumnIndex();
var dataRange = sheet.getDataRange();
var data = dataRange.getValues();
var text1 = 'Insert body of email here';
for (var i = 1; i < data.length; i++)
(function(val) {
var row = data[i];
var recipient = row[4];
var name = row[2];
var replyto = 'reply_to@email.com';
var body = 'Dear' + ' ' + name + ',' + '\n\n' + text1;
var subject = 'Hello World';
GmailApp.sendEmail(recipient, subject, body, {from:'reply_to@email.com', replyto:'reply_to@email.com'});
})(i);
}
这目前适用于 sheet_1,但不适用于 sheet_2 或 sheet_3。
有人对我如何改进此脚本以发送到多张工作表并跳过空白行有任何建议吗?
解决方案
- 您想使用电子表格中“C”和“E”列的值发送电子邮件。
- 您想为“sheet_1”、“sheet_2”和“sheet_3”的工作表名称运行脚本。
- 您想跳过没有“C”和/或“E”列值的行。
如果我的理解是正确的,那么这个修改呢?
修改点:
- 似乎在
var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName(("sheet_1","sheet_2","sheet_3")));
运行时,只检索到“sheet_3”。- 就您而言,我认为
setActiveSheet()
可能不需要使用它。
- 就您而言,我认为
- 的参数数量
getSheetByName(("sheet_1","sheet_2","sheet_3"))
为 1。- 当您想使用多个工作表时,请在循环中使用每个工作表名称。
var editedCell = sheet.getActiveRange().getColumnIndex();
未在您的脚本中使用。val
of(function(val) {
未在您的脚本中使用。- 当你想跳过空行时,请把 if 语句放在前面
GmailApp.sendEmail()
。这样,错误在 处被删除GmailApp.sendEmail()
。
当以上几点反映到您的脚本时,它变成如下。请认为这只是几个答案之一。
修改后的脚本:
请将以下修改后的脚本复制并粘贴到脚本编辑器中。
function reminders() {
var sheets = ["sheet_1","sheet_2","sheet_3"]; // Please set the sheet names here.
var ss = SpreadsheetApp.openById("SHEET-ID");
for (var s = 0; s < sheets.length; s++) {
var sheet = ss.getSheetByName(sheets[s]);
var dataRange = sheet.getDataRange();
var data = dataRange.getValues();
var text1 = 'Insert body of email here';
for (var i = 1; i < data.length; i++) {
var row = data[i];
var recipient = row[4];
var name = row[2];
if (!recipient || !name) continue; // Here, the empty rows are skipped.
var replyto = 'reply_to@email.com';
var body = 'Dear' + ' ' + name + ',' + '\n\n' + text1;
var subject = 'Hello World';
GmailApp.sendEmail(recipient, subject, body, {from:'reply_to@email.com', replyto:'reply_to@email.com'});
}
}
}
笔记:
- 在此修改后的脚本中,当“收件人”或“姓名”不存在时,将跳过该行。
- 当您发送大量电子邮件时,请注意“电子邮件读/写”的配额。你可以在这里看到它。
参考:
如果我误解了您的问题并且这不是您想要的结果,我深表歉意。
推荐阅读
- android - Android - 构建后启动自定义 gradle 任务
- python - VSCode Jupyter 扩展:丰富的语法突出显示不起作用?
- spring-boot - 使用 Spring Boot 进行 Redis 分页
- reactjs - React.useState(
) 更新 更新? - python - 为什么我的 .format() 方法在这个 JSON uri 中返回 KeyError?
- google-cloud-platform - GCloud 使用负载均衡器规则将流量重定向到特定虚拟机
- python - 找不到 Article.download() 错误 404 url
- java - Vert.x 传递 Future 而不执行
- bash - 如何在bash中使用带有星号“*”的路径的变量?
- autotools - Automake:有条件地构建子目录