Google 表格的应用程序脚本 - forEach 在编辑器 运行 时有效,但在时间触发器 运行 时没有数据

Google App Script for Sheets - forEach works when running from editor but no data when running from time trigger

我有一个功能可以在 App 脚本中发送电子邮件并使用 HTML 模板构建电子邮件正文。 forEach 循环遍历 sheet.

中的行

当我 运行 来自编辑器的函数时,一切正常。电子邮件正文包含我希望看到的行。没有错误。

当时间驱动触发器 运行 触发时,电子邮件中的输出缺少我位于 .html [=34 中的 forEach 循环中的数据(tr 和 td) =].

查看执行日志(time-driven trigger),没有错误,日志与邮件正文一致。

在测试时,我将触发计时器设置为“每 1 分钟”。

这是code.gs:

function sendScheduledEmailRFP() {
  Logger.log("function executed");
  /* Connect to spreadsheet */
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName("Data");
  var values = ss.getDataRange().getDisplayValues();
  const htmlTemplateRFP = HtmlService.createTemplateFromFile("rfpEmail");
  htmlTemplateRFP.values = values;
  const htmlForRfpEmail = htmlTemplateRFP.evaluate().getContent();

  MailApp.sendEmail(
    "email@address.com",
    "subject", 
    "Blabla", 
    { 
      htmlBody: htmlForRfpEmail
    }
  );
  Logger.log(htmlForRfpEmail);
}

这是 .html 代码(只有 forEach 部分):

  <tbody>
    <? values.forEach(r => { 

      if(r[2] === "RFP" && r[9] !== "On hold"){ ?>
        <tr>
          <td style="border: 1px solid black; text-align: left; padding: 5px; font-size: 10px;">
            <?= r[5] ?>
          </td>
          <td style="border: 1px solid black; text-align: right; padding: 5px; font-size: 10px;">
            <?= r[13] ?>
          </td>
          <td style="border: 1px solid black; text-align: right; padding: 5px; font-size: 10px;">
            <?= r[27] ?>
          </td>
        </tr>
   <? 
      } 
    }) 
   ?>
  </tbody>

这是从时间驱动触发器执行时函数的日志输出:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body style="font-family: Arial, Helvetica, sans-serif;">
   <div>
     <div>
       <h3>Today's list</h3>
       <table style="border-collapse: collapse; border: 1px solid black; font-family: Arial, Helvetica, sans-serif; width: 300px;">
         <thead>
           <tr style="background-color: #ffd166;">
             <th colspan="3" style="border: 1px solid black; text-align: left; padding: 5px; font-size: 12px;">
               Today's list
             </th>
           </tr>
         </thead>
       <tbody>
       </tbody>
     </table>  
   </div>      
 </div>

我已经尝试删除触发器并重新创建一个..同样的问题。请帮忙!

在 sheet 上使用 getDataRange(),而不是在价差上使用 sheet

  • 如果不指定 sheet,getDataRange() 默认检索活动 sheet

    上的数据范围
  • 当您 运行 时间驱动触发器上的函数时,活动 sheet 始终默认为传播 sheet 的第一个 sheet =].

  • 如果你想在sheetData上检索数据范围,你需要修改你的代码如下:

来自

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName("Data");
  var values = ss.getDataRange().getDisplayValues();

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName("Data");
  var values = ws.getDataRange().getDisplayValues();

旁注:

对于故障排除,在代码中的战略位置实施日志总是有帮助的。例如。检索它们后记录 values,记录 r[2]r[9].