首页 > 解决方案 > Google 脚本中的 .getValues() 返回非数组对象 - 导致“TypeError:无法从未定义中读取属性“0”。”

问题描述

表明我有问题的症状是错误:TypeError: Cannot read property "0" from undefined.错误附加到 for 循环内的 if 语句行。在我看来,问题出在代码的前几行,所以这就是我要放在这里的内容。我会把完整的脚本放在最后。

  var ss = SpreadsheetApp.getActive();
  var controlRoomSheet = ss.getSheetByName("Master Doc");
  var urls = controlRoomSheet.getRange(1,2,50,3).getValues();
  for(var i = 3; i < urls.length + 3; i ++){
    if(urls[i][0].slice(0, 3) == "1st" && urls[i-3][1] == null || urls[i-3][1] == "MISSING FACILITY NAME"){
      urls[i-3][1] = "MISSING FACILITY NAME";

为了找到问题,我使用google的logger.log命令查看内容。 urls没有显示为数组,它只是应该在该数组中的所有值,用逗号分隔,就是这样。

我编写了一个单独的脚本,它只做三件事,打开文档,按名称获取页面,并首先检索单个单元格的内容,然后检索整个范围。检查 Logger.log 中的结果,工作正常。然后我将相同的代码移回我的脚本中,然后 bam,它坏了。

我在这里重新创建了设置。

如果您需要其余的代码,这里是完整的脚本。

function createDocAndFirstTab(){
  var ss = SpreadsheetApp.getActive();
  var controlRoomSheet = ss.getSheetByName("Master Doc");
  var urls = controlRoomSheet.getRange(1,2,50,3).getValues();
  for(var i = 3; i < urls.length + 3; i ++){
    if(urls[i][0].slice(0, 3) == "1st" && urls[i-3][1] == null || urls[i-3][1] == "MISSING FACILITY NAME"){
      urls[i-3][1] = "MISSING FACILITY NAME";
    }
    else if(urls[i][0].slice(0, 3) == "1st" && urls[i][0].slice(0, 5) == "https" && urls[i][2] != "Yes"){
      var newDoc = urls[i-3][1];
      var newSS = SpreadsheetApp.create('newDoc');
      newSS.rename(urls[i-3][1]);
      var newDocUrl = urls[i][1];
      var sourceSS = SpreadsheetApp.openByUrl(newDocUrl);
      var allSourceTabs = sourceSS.getSheets();
      var sourceTab = allSourceTabs[0];
      sourceTab.copyTo(newSS);
      var newSSTabs = newSS.getSheets();
      var rawRoster1 = newSSTabs[1];
      rawRoster1.setName("Roster");
      urls[i-2][1] = newSS.getUrl();
      urls[i][2] = "Yes";
      //. before closing out the creation of this file, place it in the correct folder (and make sure that folder exists!)
      DriveApp.searchFolders(controlRoomSheet.getRange('C1').getValues());
    }
  }
  controlRoomSheet.getRange(1,2,controlRoomSheet.getLastRow(),3).setValues(urls);
}

标签: google-apps-scripttypeerror

解决方案


问题

为什么我收到错误“无法从未定义中读取属性“0””

回答

第 5 行,您正在使用

i < urls.length + 3;它需要未定义的索引,因此您可以使用

i < urls.length;

最终代码

function createDocAndFirstTab(){

  var ss = SpreadsheetApp.getActive();
  var controlRoomSheet = ss.getSheetByName("Master Doc");
  var urls = controlRoomSheet.getRange(1,2,50,3).getValues();

  for(var i = 3; i < urls.length; i++){

    if(urls[i][0].slice(0, 3) == "1st" && urls[i-3][1] == null || urls[i-3][1] == "MISSING FACILITY NAME"){

      urls[i-3][1] = "MISSING FACILITY NAME";

    }else if(urls[i][0].slice(0, 3) == "1st" && urls[i][0].slice(0, 5) == "https" && urls[i][2] != "Yes"){

      var newDoc = urls[i-3][1];
      var newSS = SpreadsheetApp.create('newDoc');
      newSS.rename(urls[i-3][1]);

      var newDocUrl = urls[i][1];
      var sourceSS = SpreadsheetApp.openByUrl(newDocUrl);
      var allSourceTabs = sourceSS.getSheets();
      var sourceTab = allSourceTabs[0];
      sourceTab.copyTo(newSS);

      var newSSTabs = newSS.getSheets();
      var rawRoster1 = newSSTabs[1];
      rawRoster1.setName("Roster");

      urls[i-2][1] = newSS.getUrl();
      urls[i][2] = "Yes";

      //. before closing out the creation of this file, place it in the correct folder (and make sure that folder exists!)
      DriveApp.searchFolders(controlRoomSheet.getRange('C1').getValues());

    }
  }

 controlRoomSheet.getRange(1,2,urls.length,3).setValues(urls);

}

推荐阅读