2013-07-29 43 views
1

我有此腳本刪除某些行,如果選擇科拉姆選定單元格有文件檔案化管理內容,但我不明白的地方失敗刪除在谷歌電子表格基地一排單元的內容

function DeleteRowByKeyword() { 

    var value_to_check = Browser.inputBox("Enter the keyword to trigger delete Row","", Browser.Buttons.OK); 

    // prendo quello attivo 
    var DATA_SHEET = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    var FIRST_COLUMN = Browser.inputBox("Number of Column to look at (eg: for column A enter 1)","", Browser.Buttons.OK); 

    ss.toast("removing duplicates...","",-1); 

    var dataCopy1 = DATA_SHEET.getDataRange().getValues(); 
    var deleted_rows = 0; 
    var rangeToCopy = ''; 

    if (dataCopy1.length > 0) { 
    var i = 1; 

    while (i < DATA_SHEET.getMaxRows() - deleted_rows) { 
    if ((dataCopy1[i][FIRST_COLUMN]).search(value_to_check) != -1) { 

    ss.deleteRow(i); 
    deleted_rows++; 
    } 
    i++; 
    } 
    } 


    ss.toast("Done! " + deleted_rows + ' rows removed',"",5); 
    } 

在此先感謝您的幫助

回答

3

有幾件事情需要加以改進:

  • 請記住,電子表格的行和列開始 編號爲1,在SpreadsheetApp所有方法,而javascript數組 從0開始編號。在使用這兩個數字時,您需要在這些數字 之間進行調整。

  • String.search()方法可能是一個不合適的選擇,對於 有兩個原因。 .search()將匹配子字符串,因此 ('Testing').search('i')找到匹配;您可能需要查找確切的 匹配。此外,.search()包括支持正則表達式 匹配,所以用戶可能會驚訝地發現他們的輸入解釋爲 爲正則表達式; .indexOf()可能是更好的選擇。

  • 要將操作限制爲包含數據的行,請使用.getLastRow() 而不是.getMaxRows()

  • 刪除行時,電子表格dataRange的大小將減小 ;您確實考慮了這一點,但由於您要循環使用最大尺寸的 ,因此此代碼會使代碼複雜化。 您可以通過從最大值開始循環來簡化操作。

  • 列號的輸入容易出錯,所以讓用戶輸入一個 字母;您可以將其轉換爲數字。

  • 您尚未爲ss定義值(在此函數內)。

下面是更新後的代碼:

function DeleteRowByKeyword() { 

    var value_to_check = Browser.inputBox("Enter the keyword to trigger delete Row", "", Browser.Buttons.OK); 

    var matchCol = Browser.inputBox("Column Letter to look at", "", Browser.Buttons.OK); 
    var FIRST_COLUMN = (matchCol.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1); // Convert, e.g. "A" -> 1 

    // prendo quello attivo (get active sheet) 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var DATA_SHEET = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 

    ss.toast("removing duplicates...", "", -1); 

    var dataCopy1 = DATA_SHEET.getDataRange().getValues(); 
    var deleted_rows = 0; 

    if (dataCopy1.length > 0) { 
    var i = DATA_SHEET.getLastRow(); // start at bottom 

    while (i > 0) { 
     if (dataCopy1[i-1][FIRST_COLUMN-1] === value_to_check) { 

     ss.deleteRow(i); 
     deleted_rows++; 
     } 
     i--; 
    } 
    } 

    ss.toast("Done! " + deleted_rows + ' rows removed', "", 5); 
} 
+0

非常感謝。我結束了使用。搜索,因爲我需要一個廣泛的匹配(我有一個大型的電子郵件數據庫來清理免費電子郵件)。循環現在工作很好,並且列字母比以前好得多。 – riprova

1

您需要確保刪除索引是正確的索引。當你刪除一行時,所有波紋管行的索引都改爲-1。 那麼試試這個代碼:

if (dataCopy1.length > 0) { 
var i = 1; 

while (i < DATA_SHEET.getMaxRows() - deleted_rows) { 
if ((dataCopy1[i][FIRST_COLUMN]).search(value_to_check) != -1) { 

    ss.deleteRow(i - deleted_rows); 
    deleted_rows++; 
} 
i++; 
} 
} 
相關問題