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]
.
我有一个功能可以在 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 =].
如果你想在sheet
Data
上检索数据范围,你需要修改你的代码如下:
来自
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]
.