我正在尝试为我的项目管理仪表板创建一个交互式数据库。
总而言之,我在电子表格中有几张工作表,我想构建一个函数,该函数转到特定工作表并获取一些数据并将其返回到仪表板工作表。我构建了另一个函数,将所有工作表名称放在一个数组中,然后我尝试从数组中提取工作表名称并将其传递给 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);
}
你能帮忙解决这个问题吗?
非常感谢
答案 0 :(得分:3)
只是为了解释评论中已回答的内容:
for (counter1=0; counter1 <= records.length; counter1=counter1+1) {}
这将执行 counter1 = 0
处的代码块,直到 counter1 = records.length
。但是,JavaScript 数组的索引从 0(作为第一个条目)开始,因此数组索引将从 0
到 length-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);
}
}