首先,免责声明:我是一位经验丰富的程序员,但是对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
09-16 22:11