簡體   English   中英

根據日期刪除單元格

[英]Delete Cells Based on Date

我需要有關單元格刪除腳本的幫助。 通常,我想運行一個重置腳本,以清除直到運行它之前的所有數據。 因為我正在向與過濾器中的信息匹配的單元格中靜態輸入值,所以我相信我需要刪除那些單元格,以便在我從導出頁面刪除過期的行后正確地將輸入與過濾器信息的位置對齊。

這是我要在腳本中執行的操作:如果Column F值<今天的日期,則刪除I,J和K中的單元格並將其下方的單元格向上移動。 我想我找到了執行此操作的代碼,但是運行該程序需要花費很長時間,以至於該程序無法通過多行才超時。 我將使用for循環在73頁上運行它,因此,如果它滯后於一個頁面...是的,我需要幫助!

function deleteEntries() { 
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  var datarange = ss.getDataRange();
  var lastrow = datarange.getLastRow();
  var values = datarange.getValues();

  var currentDate = new Date();

  for (i = lastrow; i >= 5; i--) {
    var tempdate = values[i-1][5];

    if (tempdate < currentDate)  
    {
      ss.getRange(i-1, 8).deleteCells(SpreadsheetApp.Dimension.ROWS);
      ss.getRange(i-1, 9).deleteCells(SpreadsheetApp.Dimension.ROWS);
      ss.getRange(i-1, 10).deleteCells(SpreadsheetApp.Dimension.ROWS);
}}}

根據Apps腳本的“最佳做法” ,您將希望限制電子表格服務的使用,以縮短執行時間。 可以考慮兩種“立即”優化:

  1. 連續刪除一個以上的單元格為此,只需選擇一個1行x 3列范圍: ss.getRange(i-1, 8, 1, 3)而不是選擇(i-1, 8)(i-1, 9)(i-1, 10) deleteCells (i-1, 10)並分別在三個Ranges上調用deleteCells
  2. 在刪除之前對工作表進行排序,以便僅需要1個delete調用(例如C ++ stdlib“ erase-remove”習慣用法 )。 如果您的數據是根據F列排序的,則所有應刪除的數據都在末尾,那么您只需要迭代內存中的數組(一個非常快速的過程)即可找到應刪除的第一個日期,然后刪除下面的所有數據,包括它。

選項2的實現如下所示( 我假設您使用凍結的標題,因為在對工作表或范圍進行排序時它們不會移動 )。

function sortDescAndGetValuesBack_(s, col) {
  return s.getDataRange().sort({column: col, ascending: false}).getValues();
}
function deleteAllOldData() {
  const sheets = SpreadsheetApp.getActive().getSheets()
      .filter(function (sheet) { /** some logic to remove sheets that this shouldn't happen on */});
  const now = new Date();
  const dim = SpreadsheetApp.Dimension.ROWS;

  sheets.forEach(function (sheet) {
    var values = sortDescAndGetValuesBack_(sheet, 6); // Col 6 = Column F
    for (var i = sheet.getFrozenRows(), len = values.length; i < len; ++i) {
      var fVal = values[i][5]; // Array index 5 = Column 6
      if (fVal && fVal < now) { // if equality checked, .getTime() is needed
        console.log({message: "Found first Col F value less than current time",
                     index: i, num2del: len - i, firstDelRow: values[i],
                     currentTime: now, sheet: sheet.getName()});
        var delRange = sheet.getRange(1 + i, 8, sheet.getLastRow() - i, 3);
        console.log({message: "Deleting range '" + sheet.getName() + "!" + delRange.getA1Notation() + "'"});
        delRange.deleteCells(dim);
        break; // nothing left to do on this sheet.
      }
    }
    console.log("Processed sheet '" + sheet.getName() + "'");
  });
}

參考文獻:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM