如何在Google Sheet列中搜索数组的值,如果找不到则插入数组值?

时间:2015-10-19 16:47:40

标签: google-apps-script google-sheets

我在Google Script中有一个数据数组(数组中大约有10个项目)。 如何在A列中搜索这些数组项? (例如:搜索从单元格a12开始到结束的项目)如果在A列中找不到数组值,那么将它们添加到A列的末尾?

我尝试使用

data[n][0].toString().match(values_array[i])==values_array[i] 

第二次下次运行该功能时,我看到重复数据输入!

例如,从A1到A10的数据如下:(1,2,3,4,5,6,7,8,9,10) 第一次运行该功能时,它将所有数据添加到A列(开始a12)

第二次运行从A1到A10的相同数据的功能,它不应该输入任何东西,但它再次添加1,2,3,4,5,6,7,8,9,10!我不喜欢#39;不知道为什么这段代码就像这样!

如果专家告诉我如何修复此代码,我将不胜感激。谢谢。

function  find2(){
  var sheet = SpreadsheetApp.getActiveSheet(),
      range,
      values_array; 

  range = sheet.getRange('a1:a10');
  values_array = range.getValues();

  var sh = SpreadsheetApp.getActiveSheet();
  var range2 = sh.getRange('a12:a')
  data = range2.getValues(); // read all data in the sheet

  var lastRowIndex=getLastColumnRow(0)

  for (var i = 0; i < values_array.length; i++) {
    for(n=0;n<data.length;++n){ // iterate row by row and examine data in column A
      if(data[n][0].toString().match(values_array[i])==values_array[i]){
      } else {
        var lastEmptyRowIndex=1+lastRowIndex+i
        SpreadsheetApp.getActiveSheet().getRange('a'+lastEmptyRowIndex).setValue(values_array[i]);
      };
    }//end of innter for loop
  }// end of outer for loop
}


function setUp() {
  ScriptProperties.setProperty('active', SpreadsheetApp.getActiveSpreadsheet().getId());
}

function getLastColumnRow(RowNumber) {
  var ss = SpreadsheetApp.openById(ScriptProperties.getProperty('active'));
  var sheet = ss.getSheetByName("Sheet1");

  var data = sheet.getDataRange().getValues();
  var numRows = data.length;

  // loop from bottom to top for last row in given row "RowNumber"
  while( data[numRows - 1][RowNumber] == "" && numRows > 0 ) {
    numRows--;
  }
  return numRows
}

1 个答案:

答案 0 :(得分:1)

您在此脚本中执行了许多不必要且令人困惑的步骤。

  • 声明仅使用一次的中间变量
  • 错误变量(getLastColumnRow中的RowNumber实际上是列)
  • 执行部分字符串搜索完整匹配
  • 设置要单独追加的号码而不是一次性追加

这就是为什么我选择不尝试修改你的功能,我希望你理解。 以下功能将满足您的需求

如果有很多行,可以通过对最后一行的二进制搜索进行优化,如果活动工作表只使用SpreadsheetApp.getActiveSheet().getLastRow(),则可以优化它,如果这是唯一的范围,但对于大多数应用程序来说应该足够快。

function appender(){
  var values_array = SpreadsheetApp.getActiveSheet().getRange('A1:A10').getValues();
  var data = SpreadsheetApp.getActiveSheet().getRange('A12:A').getValues();

  var toAdd = [];
  for(var value in values_array){
    for(var i = 0; i < data.length; ++i){
      if(values_array[value][0] == data[i][0]){break;}
      if(data[i][0] == ""){
        toAdd.push(values_array[value]);
        break;
      }
    }
  }

  if(toAdd.length > 0){
    for(i = 0; i < data.length; ++i){
      if(data[i][0] == ""){break;}
    }
    SpreadsheetApp.getActiveSheet().getRange(12 + i, 1, toAdd.length, 1).setValues(toAdd);
  }
}