首先,免责声明:我是一位经验丰富的程序员,但是对Javascript和Google Script的全新内容感到非常生疏。
我正在尝试编写一个将
在每张纸的指定列中搜索给定的编号(标签)。
找到该数字后,将附近单元格中的其他信息存储在字符串中
返回完成的字符串(使其成为单元格值)
该函数将以“ = parent(tag)”的形式输入到单元格中,从而免除了我寻找信息并手动复制信息的麻烦。
我已经检查了其他几个问题,但是我还没有到那里。请在下面查看我对这些资源的评论。
How do I search Google Spreadsheets?-这个问题的第一个答案很简单,但是没有包含任何Google脚本特定的代码。
Find value in spreadsheet using google script-这个似乎正在寻找类似的解决方案,因此我尝试从第一个答案改编代码。
以下是我从源代码2改编的代码。似乎它应该可以工作,但是当我运行它时,我得到了一个错误,
TypeError:无法从未定义中读取属性“ 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开始。
因此data.length为2表示索引为0,1的数组。尝试将for循环修改为以下内容
for(var i=0; i < data.length ;i++)
错误的解释:在循环中,代码正在尝试在分配的数组值之外进行访问,因此未定义。
编辑:我在说什么的更多解释。因此,当我说“ data.length 2表示索引为0,1的数组”时,我只是想指出一个带以下比较运算符i