![](/img/trans.png)
[英]How do I include scripts in my Google Apps Script/Google Sheets HTML?
[英]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}`);
}
這是一個循環操作,循環編輯范圍內的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.