访问for循环的索引会产生'undefined'结果

时间:2018-03-28 15:08:47

标签: javascript arrays google-apps-script

我正在尝试使用 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

我怎么解决这个问题?

1 个答案:

答案 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