如何通过触发器send/archive从一个sheet到另一个send/archive一行数据?
How to send/archive a row of data from one sheet to another through trigger?
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var r = ss.getActiveRange();
var rows = r.getRow();
var cell = s.getRange(rows, r.getColumn());
if (s.getName() == "Sheet" && r.getColumn() == 2 && cell.getValue() == "Archive" || cell.getValue() == "Cancel" || cell.getValue() == "Canceled" || cell.getValue() == "Cancelled") { // "Sheet" is original sheet, 2 is column to search for trigger
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Sheet Archive"); // "Sheet Archive" is the 2nd/target sheet
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(rows, 1, 1, numColumns).moveTo(target);
s.deleteRow(rows);
Logger.log(target);
}
我想要一种将一行数据从 sheet (Sheet) 发送到另一个 (Sheet 存档) 的方法。如果“存档”写在一行的第 2 列,它会将数据发送到存档 sheet.
我希望数据一行一行地堆叠。假设我在 Sheet #1 中归档了第 20 行,我希望它将数据发送到第 9 行。如果我归档第 21、22、30、31 等行,它应该将归档的行一个接一个地堆叠,因此在归档的第 9、10、11、12、13 等行中。
我曾经使用过的代码,但后来我重新设计了 sheet,它们停止工作了。当我键入存档时,它会从 Sheet #1 中删除它,但随后在存档 sheet 中它会丢失。所以它正在“发送”它,但它没有正确显示或粘贴。有没有更好的方法?
谢谢
将数据传输到 select 个工作表并删除当前行
function onEdit(e) {
const sh = e.range.getSheet();
const cvs = ['Archive', 'Cancel', 'Canceled', 'Cancelled'];//target sheets
const idx = cvs.indexOf(e.value);//to get sheetname
if (sh.getName() == 'Sheet' && e.range.columnStart == 2 && ~idx && e.range.rowStart>1) {
const vs = sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn()).getValues();
const tsh = e.source.getSheetByName(cvs[idx]);
tsh.getRange(tsh.getLastRow() + 1, 1, vs.length, vs[0].length).setValues(vs);
sh.deleteRow(e.range.rowStart);//delete current row
}
}
工作表 1:
我已经稍微清理了你的代码,但看起来基本没问题。 Isstead 使用 getActiveRange
和 getActiveSheet
,使用触发器参数提供的范围。这就是它的样子:
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var r = e.range;
var s = r.getSheet();
var row = r.getRow();
var col = r.getColumn();
var cell = s.getRange(row, col);
var archiveStates = ["Archive", "Cancel", "Canceled", "Cancelled"];
if (s.getName() === "Sheet" && r.getColumn() === 2 && archiveStates.includes(cell.getValue())) {
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Sheet Archive"); // "Sheet Archive" is the 2nd/target sheet
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
我还移动了您测试选项的方式并使用了严格相等(注意这一点)。
参考资料
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var r = ss.getActiveRange();
var rows = r.getRow();
var cell = s.getRange(rows, r.getColumn());
if (s.getName() == "Sheet" && r.getColumn() == 2 && cell.getValue() == "Archive" || cell.getValue() == "Cancel" || cell.getValue() == "Canceled" || cell.getValue() == "Cancelled") { // "Sheet" is original sheet, 2 is column to search for trigger
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Sheet Archive"); // "Sheet Archive" is the 2nd/target sheet
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(rows, 1, 1, numColumns).moveTo(target);
s.deleteRow(rows);
Logger.log(target);
}
我想要一种将一行数据从 sheet (Sheet) 发送到另一个 (Sheet 存档) 的方法。如果“存档”写在一行的第 2 列,它会将数据发送到存档 sheet.
我希望数据一行一行地堆叠。假设我在 Sheet #1 中归档了第 20 行,我希望它将数据发送到第 9 行。如果我归档第 21、22、30、31 等行,它应该将归档的行一个接一个地堆叠,因此在归档的第 9、10、11、12、13 等行中。
我曾经使用过的代码,但后来我重新设计了 sheet,它们停止工作了。当我键入存档时,它会从 Sheet #1 中删除它,但随后在存档 sheet 中它会丢失。所以它正在“发送”它,但它没有正确显示或粘贴。有没有更好的方法?
谢谢
将数据传输到 select 个工作表并删除当前行
function onEdit(e) {
const sh = e.range.getSheet();
const cvs = ['Archive', 'Cancel', 'Canceled', 'Cancelled'];//target sheets
const idx = cvs.indexOf(e.value);//to get sheetname
if (sh.getName() == 'Sheet' && e.range.columnStart == 2 && ~idx && e.range.rowStart>1) {
const vs = sh.getRange(e.range.rowStart, 1, 1, sh.getLastColumn()).getValues();
const tsh = e.source.getSheetByName(cvs[idx]);
tsh.getRange(tsh.getLastRow() + 1, 1, vs.length, vs[0].length).setValues(vs);
sh.deleteRow(e.range.rowStart);//delete current row
}
}
工作表 1:
我已经稍微清理了你的代码,但看起来基本没问题。 Isstead 使用 getActiveRange
和 getActiveSheet
,使用触发器参数提供的范围。这就是它的样子:
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var r = e.range;
var s = r.getSheet();
var row = r.getRow();
var col = r.getColumn();
var cell = s.getRange(row, col);
var archiveStates = ["Archive", "Cancel", "Canceled", "Cancelled"];
if (s.getName() === "Sheet" && r.getColumn() === 2 && archiveStates.includes(cell.getValue())) {
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Sheet Archive"); // "Sheet Archive" is the 2nd/target sheet
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
我还移动了您测试选项的方式并使用了严格相等(注意这一点)。