首先,免责声明:我是一位经验丰富的程序员,但是使用Javascript和Google Scripts的全新版本非常生疏。
我正在尝试编写一个
的函数该功能将作为“= parent(tag)”输入到单元格中,以便省去搜索信息和手动复制的麻烦。
我已经检查过其他一些问题,但我还是不太确定。请参阅我对以下这些来源的评论。
How do I search Google Spreadsheets? - 这个问题的第一个答案很简单,但没有包含任何特定于Google脚本的代码。
Find value in spreadsheet using google script - 这个似乎正在寻找类似的解决方案,所以我试图调整第一个答案中的代码。
下面是我从源代码2改编的代码。好像它应该可以工作,但是当我运行它时我得到一个错误,
TypeError:无法从undefined中读取属性“0”。 (第19行)。
TLDR:请帮我修复此代码以搜索电子表格。第19行有错误。
编辑:在我的问题末尾添加了正确的代码。新手的错误,我会责怪我被编译器宠坏了:)
function parent(tag) {
var sh = SpreadsheetApp.getActiveSpreadsheet();
var titleRow = 6;
var parentRow = 0;
//create array with sheets in active spreadsheet
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
//loop through sheets to look for value
for (var i in sheets) {
SpreadsheetApp.setActiveSheet(sheets[i])
var sheet = sh.getActiveSheet();
var data = sheets[i].getDataRange().getValues();
//loop through data on sheet
for (var r=1;r<=data.length;++r) {
if(typeof(data[r][0])!=="undefined") { //<-- This is where the error occurs
if (data[r][0] == tag) {
parentRow = r;
// Populate Genes
var result = "#" + tag + "(";
var z = 0;
for (var j=8; j<12; j++) {
if (data[titleRow][j] == "Genotype") {
if (z==0) {
result = result + data[titleRow-1][j];
z=1;
}
else {
result = result + "-" + data[titleRow-1][j];
}
}
}
result = result + ") ";
// Populate Genotype
var z = 0;
for (var j=8; j<12; j++) {
if (data[titleRow][j] == "Genotype") {
if (z==0) {
result = result + "" + data[dataRow][j];
z=1;
}
else {
result = result + "/" + data[dataRow][j];
}
}
}
// result = result + " " + dataRow;
return result;
}
}
}
}
}
以下是更正后的代码(包括导致问题的重命名变量)。
function parent(tag) {
var sh = SpreadsheetApp.getActiveSpreadsheet();
var titleRow = 6;
var dataRow = 0;
//create array with sheets in active spreadsheet
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
//loop through sheets to look for value
for (var i in sheets) {
SpreadsheetApp.setActiveSheet(sheets[i])
var sheet = sh.getActiveSheet();
var data = sheets[i].getDataRange().getValues();
//loop through data on sheet
for (var r = 0; r < data.length; r++) { //<-- Here's the fix
if(typeof(data[r][0])!=="undefined") {
if (data[r][0] == tag) {
dataRow = r;
// Populate Genes
var result = "#" + tag + "(";
var z = 0;
for (var j=8; j<12; j++) {
if (data[titleRow][j] == "Genotype") {
if (z==0) {
result = result + data[titleRow-1][j];
z=1;
}
else {
result = result + "-" + data[titleRow-1][j];
}
}
}
result = result + ") ";
// Populate Genotype
var z = 0;
for (var j=8; j<12; j++) {
if (data[titleRow][j] == "Genotype") {
if (z==0) {
result = result + "" + data[dataRow][j];
z=1;
}
else {
result = result + "/" + data[dataRow][j];
}
}
}
// result = result + " " + dataRow;
return result;
}
}
}
}
}
答案 0 :(得分:2)
问题是数组索引从0开始。 所以data.length为2意味着索引为0的数组。尝试将for循环修改为以下
for(var i=0; i < data.length ;i++)
错误说明:在循环中,代码试图在指定的数组值之外访问,因此未定义。
编辑:对我所说的内容进行更多解释。因此,当我说&#34; data.length为2意味着数组带有索引0,1&#34;时,我只是想指出一个带有以下比较运算符i&lt; = data.length的for循环导致该值为最后一次迭代时i = 2。但是长度为2的数组的指数不为2.希望这可以澄清我试图传达的内容。