google-apps-script - 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);
}
解决方案
问题
为什么我收到错误“无法从未定义中读取属性“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);
}
推荐阅读
- c++ - 如何在 TBB 代码中完全关闭线程
- reactjs - 如何使用 var 作为对象的键进入反应项目
- sql - 下面的 SQL Server 查询在第 4 列中返回(无列名)。如何在第 4 列中创建列名
- c++ - 在结构中重载 ostream 和 istream 时逗号分开
- kubernetes - core-dns 说 NXDOMAIN 来自 Kubernetes 外部的查询
- amazon-web-services - 哪些资源可以驻留在 Amazon VPC 中?
- python - 使用python查找Land中最近的位置坐标
- c - 使用结构前缀初始化是什么意思?
- c++ - C++ 在一张地图中存储不同的指针类型(并处理销毁)
- google-bigquery - 数据处理 - BigQuery 与 Data Proc+BigQuery