簡體   English   中英

如何改進用於在 Google Apps 腳本中拖動多個單元格的腳本?

[英]How do I improve my script for dragging multiple cells in Google Apps Scripts?

我在這里有一個谷歌腳本,它將行從一個工作表發送到另一個工作表,然后根據單元格值刪除源行。 目的是將舊任務發送到單獨的電子表格(即從“任務列表”選項卡到“存檔任務列表”選項卡),以防止在一張工作表中過度擁擠。

當我將狀態(第 5 列)更改為“存檔”時,我的代碼成功運行,但是當我嘗試一次更改多行(即向下拖動或復制)時,該腳本僅適用於一行。 我想我必須創建某種循環來阻止這個問題,但我是腳本的新手,所以對此的任何幫助都會很棒!

這是我到目前為止的代碼:

function onEdit(event) {
  // assumes source data in sheet named Task List
  // target sheet of move to named Archive Task List
  // test column with "Archive" is col5
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Task List" && r.getColumn() == 5 && r.getValue() == "Archive") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Archive Task List");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}

更新:我已經實現了建議的代碼更改,並且腳本對於單行編輯仍然可以正常工作,但是如果我一次進行 2 次或多次編輯,循環會歸檔所選范圍之外的一些行。 一個例子是,如果我將單元格 F16:F19 全部與條目“存檔”一起復制並粘貼到 col5 中。 我更新的代碼是:

function onEdit(event) {
  // assumes source data in sheet named Task List
  // target sheet of move to named Archive Task List
  // test column with "Archive" is col5 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Task List" && r.getColumn() == 5 && r.getValue() == "Archive") {
    var row = r.getRow();
    var lastRow = r.getLastRow(); //Save the last edited row index
    var numColumns = s.getLastColumn();
    var numRows = lastRow - row == 0? 1: lastRow - row; // numRows has to be at least 1 =, this is in case of a single-line row.
    var targetSheet = ss.getSheetByName("Archive Task List");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    //s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.getRange(row, 1, numRows, numColumns).moveTo(target); // Take in account the lastRow when archiving the edited range.     
    //s.deleteRow(row);
    for (let i = row; i<=lastRow; i++) {
      s.deleteRow(i);
      console.log(`Deleted row ${i}`);
    }
  }
}

考慮

在您當前的腳本中,您只使用編輯范圍的第一行: var row = r.getRow(); . 這就是為什么它只需要多行編輯范圍的第一行。 為了解決這個問題,你應該考慮編輯范圍的最后一行,你可以使用var lastRow = r.getLastRow();輕松獲得它var lastRow = r.getLastRow(); .

牢記這一點,我建議對您的腳本進行這些修改:

解決方案

第一:

   var row = r.getRow();
   var lastRow = r.getLastRow(); //Save the last edited row index

第二個(編輯):

獲取整個編輯行的正確語法: getRange(row, column, numRows, numColumns)

    var numRows = lastRow-row + 1; // Corrected this calculation
    s.getRange(row, 1, numRows, numColumns).moveTo(target); // Take in account the lastRow when archiving the edited range. 

第三個(編輯):

刪除所有存檔的行:

for (let i = row; i<=lastRow; i++) {
      s.deleteRow(row); // The row deletion will slide up all the other rows so the next row to delete will have always the same index
      console.log(`Deleted row ${row} at pass number ${i}`);
    }

這是一個循環操作,循環編輯范圍內的行。

參考

getRange(row,col,numRow,numCol)

for循環

事件對象

暫無
暫無

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

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