简单搜索电子表格中的所有工作表

时间:2017-02-04 00:04:54

标签: javascript google-apps-script google-sheets runtime-error

首先,免责声明:我是一位经验丰富的程序员,但是使用Javascript和Google Scripts的全新版本非常生疏。

我正在尝试编写一个

的函数
  1. 在每个工作表中搜索指定列(标记)。
  2. 找到该号码后,将附近单元格中的其他信息存储在字符串中
  3. 返回完成的字符串(使其成为单元格值)
  4. 该功能将作为“= 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;
            }
          }
        }
      }
    }
    

1 个答案:

答案 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.希望这可以澄清我试图传达的内容。