我被困在这里。我已经阅读了几种解决方案,但仍然无法找出问题所在。该怎么办?
function sendPDFForm()
{
var row = SpreadsheetApp.getActiveSheet().getActiveCell().getRow();
sendEmailWithAttachment(row);
}
function sendEmailWithAttachment(row)
{
var filename= 'Poster-CoV-WS-E1-merged.pdf';
...
}
function getClientInfo(row)
{
var sheet = SpreadsheetApp.getActive().getSheetByName('test');
if (sheet != null) {
var values = sheet.getRange('A2:B4').getValues();
//var values = sheet.getRange(row,1,row,3).getValues();
var rec = values[0];
}
var client =
{
first_name: rec[0],
email: rec[1]
};
client.name = client.first_name;
return client;
}
function sendFormToAll()
{
var sheet = SpreadsheetApp.getActive().getSheetByName('test');
var last_row = sheet.getDataRange().getLastRow();
for(var row=2; row <= last_row; row++)
{
sendEmailWithAttachment(row);
sheet.getRange(row,4).setValue("email sent");
}
}
在这里,我分享了完整的代码。运行它时,它仅显示错误内联54
答案 0 :(得分:2)
错误说明
您需要学习阅读错误消息,否则前进将非常困难。消息指出:
TypeError:无法读取未定义的属性“ 0”(第54行,文件“代码”)
让我们解析消息的含义:
现在,“尝试访问”意味着您已指示脚本在对象上调用property accessor。由于该消息指向属性0
,因此您可能试图通过其 index 来访问数组中的 ,您这样做:{{1 }}。
当您获得rec[0]
时,您期望TypeError
是一个数组,但是变量保留了rec
。您将undefined
变量(顺便说一句,请参见下面的第1点)初始化为rec
,并将values[0]
初始化为调用values
的结果。
因为getValues
总是返回一个二维值数组,所以这不是问题。然后,正如已经指出的,唯一的选择是永远不会到达getValues()
语句块,这意味着if
是sheet != null
。
false
的唯一原因是因为getSheetByName()
在找不到工作表时返回sheet != null
。这是一个重现错误的小样本:
null
优化点
function MCVE(testValue) {
if(testValue != null) {
var test = "not null";
};
test || console.log("Expected test to be defined");
}
MCVE(null);
变量在rec
语句中声明,但在该语句之外访问。if
。 JavaScript为您提供了很多帮助,因此有一天您可能会错过解释器,因为它决定在您的{
语句后加上;
... if
循环中的setValue
)-它们很慢,而在Google表格中它们却是< em>非常很慢,请改用for
(也将setValues()
移出循环)。getRange()
/ ===
)。 99%的时间使用严格比较会教您注意正确使用类型,并避免令人沮丧的错误。例如:
!==