我正在尝试使用 for loop 与所有工作表以及这些工作表中的所有行进行交互。我是按照以下方式做的:
function verifyUrls(){
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i in sheets){
var values = sheets[i].getDataRange().getValues();
for(var n = 0; n < values.length; n++) {
// URLs are in 4 column, first row is a header
var urls = values[n+1][3];
var options = {
'muteHttpExceptions': true,
'followRedirects': false
};
try {
var resposta = UrlFetchApp.fetch(urls, options);
var rangeUrl = sheets[i].getRange([n+2],4) // I want to insert a note in URL cells
rangeUrl.setNote("NICE")
}
catch(e) {
var rangeUrl = sheets[i].getRange([n+2],4)
rangeUrl.setNote("ERROR")
}
}
}
}
但我收到错误
TypeError:无法从undefined(第7行,arquivo“Code”)读取属性“3”。
我知道当代码循环到第二张时会触发错误。在第一张表格中工作正常。
我创建了一个测试电子表格:https://docs.google.com/spreadsheets/d/1rwx2BJqjRUiyNQZNxG7npgr3zl_ARudMKjkrsgYhgaA/edit
我怎么解决这个问题?
答案 0 :(得分:1)
您的迭代方案存在缺陷,并访问越界索引。
您的代码:
for(var n = 0; n < values.length; n++) {
var urls = values[n+1][3];
这意味着n
的值为0, 1, ...., values.length-1
。当您致电values[n + 1][3]
时,如果n
的值为values.length - 1
,则会导致访问values[values.length]
undefined
,因为values
的数据位于0, .. values.length - 1
指数undefined
。因此,尝试访问for(var n = 1; n < values.length; n++) {
var urls = values[n][3];
对象的第4个索引会导致您收到错误。
解决方案是更改迭代边界,或更改数组访问:
for(var n = 0; n < values.length - 1; n++) {
var urls = values[n + 1][3];
或
var values = sheet.getSheetValues(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());
另一个解决方案是不选择values数组中的标题:
var values = sheet.getDataRange().getValues();
var headers = values.splice(0, 1);
或在阅读后弹出它们:
for(var n = 0; n < values.length; n++) {
/* do stuff with n */
之后&#34;正常&#34;迭代架构将按预期工作:
set