google-apps-script - Google Sheets onEdit 在具有不同列的工作表之间移动行
问题描述
我正在尝试创建一个简单的装运处理流程,并希望使用 onEdit 复选框触发器在两个工作表(选项卡)之间移动行。
基本概念是由多件组成的货物在第一张表上输入,然后复制到 WB_Log 表中。当计划将什么装载到卡车上时,一个复选框用于将工件从 WB_Log 表移动到 Load_Plan 表,它们的装载位置将在复选框右侧的列中确定。如果一件或多件货物不适合特定的卡车,我想取消选中 Load_Plan 上的框并将该行移回 WB_Log 表。
这是我发现几乎可以使用的 onEdit 函数:
function onEdit(event) {
// assumes source data in sheet named WB_Log
// target sheet of move to named Load_Plan
// getColumn with check-boxes is currently set to column 14 or N
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if(s.getName() == "WB_Log" && r.getColumn() == 14 && r.getValue() == true) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Load_Plan");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
} else if(s.getName() == "Load_Plan" && r.getColumn() == 14 && r.getValue() == false) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("WB_Log");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
我的问题是 Load_Plan 在复选框右侧有我不想移回 WB_Log 的列。如何调整代码,以便在未选中复选框(False)时,仅 A:N 列中的信息从 Load_Plan 移回 WB_Log?
任何人都可以提供的任何建议或想法将不胜感激。
解决方案
修改点:
- 当我看到您共享的电子表格时,“WB_Log”表在“N”列中有复选框。复选框被放在工作表的底部。这样,
targetSheet.getLastRow() + 1
返回工作表按钮的下一行。我认为这是您的问题的原因。- 我认为在您的情况下,当检索到“B4”后行的最后一行时,可以使用行号。
- 并且,在您的脚本中,“Load_Plan”表中的“A”到“O”列由
var numColumns = s.getLastColumn()
. 但是“WB_Log”表具有“A”到“N”列。我认为检索到的列需要减少 1 列。
当以上几点反映到您的脚本时,它变成如下。
修改后的脚本:
请按如下方式修改您的脚本。
从:} else if(s.getName() == "Load_Plan" && r.getColumn() == 14 && r.getValue() == false) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("WB_Log");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
至:
} else if(s.getName() == "Load_Plan" && r.getColumn() == 14 && r.getValue() == false) {
var row = r.getRow();
var numColumns = s.getLastColumn() - 1; // Modified
var targetSheet = ss.getSheetByName("WB_Log");
var lastRow = targetSheet.getRange("B4").getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); // Added
var target = targetSheet.getRange(lastRow + 1, 1); // Modified
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
参考:
推荐阅读
- javascript - 错误:端点上不存在列“未定义”
- javascript - 如何在javascript中加密/解密浮点数组
- c# - Discord.net 通过控制台发送消息
- linux - 未能创建符号链接 - 没有这样的文件或目录
- python - 特定PC上的“ConnectionResetError:[WinError 10054]现有连接被远程主机强行关闭”
- java - 无法在firebase android java中更新配置文件值
- android - Android Studio 在创建 ActivityResultCallback 实例时不断显示错误
- javascript - 在 JavaScript 中更新 objectURL
- java - OneToMany 和 ManyToOne 实体对象以递归方式链接
- vba - MSAccess 登录表单