2015-10-19 41 views
0

我在Google脚本中有一组数据(数组中有大约10个项目)。 如何搜索列A中的这些数组项? (例如:搜索从单元格a12开始直到结尾的项目),并且如果在列A中找不到数组值,然后将它们添加到列A的结尾?如何搜索Google表格列中的数组值并在未找到时插入数组值?

我试图用

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!我不知道为什么这个代码是这样的!

如果有专家告诉我如何解决这个问题,我将不胜感激。

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

你在这个脚本中做了很多不必要的和令人困惑的步骤。

  • 声明,仅用于一次中间变量
  • Misnaming的变量(在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); 
    } 
} 
+0

非常感谢。我从一个API获取一些数据,所以行数增加。你认为你的避免重复数据的方法会在每次行数增加10时快速有效吗?你的代码是否比较完全匹配?最后你可以解释这部分数据[i] [0] =“”?然后将值添加到数组,最后将完整数组插入到列的末尾。 – user1788736