首页 > 解决方案 > 获取 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。

有人对我如何改进此脚本以发送到多张工作表并跳过空白行有任何建议吗?

标签: javascriptgoogle-apps-scriptgoogle-sheetsautomation

解决方案


  • 您想使用电子表格中“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();未在您的脚本中使用。
  • valof(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'});
    }
  }
}

笔记:

  • 在此修改后的脚本中,当“收件人”或“姓名”不存在时,将跳过该行。
  • 当您发送大量电子邮件时,请注意“电子邮件读/写”的配额。你可以在这里看到它。

参考:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。


推荐阅读