2015-10-19 35 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