1

我有工作代碼,如果列對應於其中一個條件,則從表中刪除行。它基於數組,因爲它的工作速度比標準谷歌表deleteRow函數快得多。我這樣稱呼它:通過包含值改進功能刪除行

deleteRowsBV('SIZ',4,'0','') 

其中

deleteRowsBV(listName,ColNum,FirstSearch,SecondSearch) 

我要的是有或多或少和等號通話功能,像這樣:

deleteRowsBV('SIZ',4,<='0',=='') 

但在的情況下,我的主要功能,它不起作用,當我指定一個變量,而不是一個符號和一個值。 下面是主要功能:

function deleteRowsBV(listName,ColNum,FirstSearch,SecondSearch) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName(listName); 
    var DataLengBefore = sheet.getLastRow(); 
    var DataColLeng = sheet.getLastColumn(); 
    var data = sheet.getRange(1,1,DataLengBefore,DataColLeng).getValues(); 
    for (var i = data.length-1; i >= 0; i--) { 
    if (data[i][ColNum] <= FirstSearch||data[i][ColNum] == SecondSearch) { 
     data.splice(i, 1); 
    } 
    } 
    sheet.getRange(10, 1, DataLengBefore,DataColLeng).clearContent(); 
    sheet.getRange(10, 1,data.length,5).setValues(data); 
} 

回答

0

從這個related post基礎,電子表格的行和列編號從1開始,在SpreadsheetApp所有方法,而JavaScript數組開始從0開始編號,您需要這些數字之間調整與兩者一起工作時的基礎。刪除行時,電子表格dataRange的大小會變小;您確實考慮了這一點,但由於您正在循環達到最大大小,因此此代碼使代碼複雜化。您可以通過從最大值開始循環來簡化事情。

您可以參考這個thread。但是,這隻會查看單個單元格編輯的值,而不是整個表格中的值。

function onEdit(e) { 
    //Logger.log(JSON.stringify(e)); 
    //{"source":{},"range":{"rowStart":1,"rowEnd":1,"columnEnd":1,"columnStart":1},"value":"1","user":{"email":"","nickname":""},"authMode":{}} 
    try { 
    var ss = e.source; // Just pull the spreadsheet object from the one already being passed to onEdit 
    var s = ss.getActiveSheet(); 

    // Conditions are by sheet and a single cell in a certain column 
    if (s.getName() == 'Sheet1' && // change to your own 
     e.range.columnStart == 3 && e.range.columnEnd == 3 && // only look at edits happening in col C which is 3 
     e.range.rowStart == e.range.rowEnd) { // only look at single row edits which will equal a single cell 
     checkCellValue(e); 
    } 
    } catch (error) { Logger.log(error); } 
}; 

function checkCellValue(e) { 
    if (!e.value || e.value == 0) { // Delete if value is zero or empty 
    e.source.getActiveSheet().deleteRow(e.range.rowStart); 
    } 
}