谷歌应用程序脚本中无法识别数组值

时间:2021-07-21 13:32:36

标签: google-apps-script google-sheets

我正在尝试为我的项目管理仪表板创建一个交互式数据库。

总而言之,我在电子表格中有几张工作表,我想构建一个函数,该函数转到特定工作表并获取一些数据并将其返回到仪表板工作表。我构建了另一个函数,将所有工作表名称放在一个数组中,然后我尝试从数组中提取工作表名称并将其传递给 datafetch 函数以转到工作表并获取数据。但是,datafetch 函数无法从数组中读取工作表名称。似乎数组以数字格式存储数据,而 datafetch 函数需要一个工作表名称,它是一个字符串。这就是为什么错误消息就像

10:53:32 PM Error   
TypeError: Cannot read property 'getRange' of null
latestUpdate    @ Latest Update.gs:21

这意味着工作表不存在而工作表确实存在,因为我构建了其他功能并且它们都在工作。

代码是

function latestUpdate() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var numOfRecords = ss.getSheetByName('Projects List').getLastRow();
  var counter;
  var records = [];
  //storing records in array
  for(counter = 1; counter < numOfRecords; counter = counter+1){

    records[counter-1] = ss.getSheetByName('Projects List').getRange(counter+1,1).getValue();

  }

  //fetching data from the sheet
  
  var counter1; //a counter;
  var lastUpdateDate;
  var updateDates = [];

  for (counter1=0; counter1 <= records.length; counter1=counter1+1){

    lastUpdateDate = ss.getSheetByName(records[counter1]).getRange(1,17).getValue(); //error happens here
    updateDates = ss.getSheetByName(records[counter1]).getRange(3,7,50).getValues(); //error happens here

  }


  Logger.log(records);
  Logger.log(lastUpdateDate);
  
}

你能帮忙解决这个问题吗?

非常感谢

2 个答案:

答案 0 :(得分:3)

只是为了解释评论中已回答的内容:

for (counter1=0; counter1 <= records.length; counter1=counter1+1) {}

这将执行 counter1 = 0 处的代码块,直到 counter1 = records.length。但是,JavaScript 数组的索引从 0(作为第一个条目)开始,因此数组索引将从 0length-1。访问记录[长度] 不是有效引用,getSheetName() 方法返回 null。

答案 1 :(得分:2)

以防万一。您可以使用 for (element of array) 循环条件代替计数器。而且您甚至不需要循环来获取记录列表。您的代码可能如下所示:

function latestUpdate() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var rec_sheet = ss.getSheetByName('Projects List');
  var records = rec_sheet.getRange('A2:A' + rec_sheet.getLastRow()).getValues().flat();

  //fetching data from the sheet
  
  for (var rec of records) {
    var lastUpdateDate = ss.getSheetByName(rec).getRange(1,17).getValue();
    Logger.log(lastUpdateDate);

    var updateDates = ss.getSheetByName(rec).getRange(3,7,50).getValues();
    Logger.log(updateDates);
  }

}