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崩溃了。

我已经重新创建了设置here

如果需要其余代码,请参见完整脚本。

function createDocAndFirstTab(){
  var ss = Spreadsheetapp.getactive();
  var controlRoomSheet = ss.getSheetByName("Master Doc");
  var urls = controlRoomSheet.getRange(1,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,controlRoomSheet.getLastRow(),3).setvalues(urls);
}
geaixin520 回答:Google脚本中的.getValues()返回非数组对象-结果为“ TypeError:无法从未定义中读取属性” 0”。

问题

为什么我收到错误消息“无法从未定义读取属性“ 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,urls.length,3).setValues(urls);

}
本文链接:https://www.f2er.com/2760189.html

大家都在问