【发布时间】:2020-12-24 10:27:19
【问题描述】:
我对 Google 脚本非常陌生,应该首先学习基础知识,但我直接尝试为朋友解决问题。在网上找到了这段代码,这是我想要实现的完美解决方案,但是,以下代码 sn-p 似乎导致问题并且没有执行其预期功能:
} else if (s.getName() == "Tab1" && r.getColumn() == 1 && r.getValue() == "") {
// Remove the row from "Tab2" when the checkbox in "Tab1" is unchecked
var prop = PropertiesService.getDocumentProperties();
var targetRow = prop.getProperty(row);
ss.getSheetByName("Tab2").deleteRow(targetRow);
Logger.log("Deleted the " + targetRow + "row from " + s.getName());
prop.deleteProperty(row);
完整代码如下:
function onEdit(event) {
// assumes source data in sheet named "Tab1"
// target sheet of move to named "Tab2"
// getColumn with check-boxes is currently set to colu 1 or C
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
var row = r.getRow();
var numColumns = s.getLastColumn();
Logger.log(r.getValue());
if (s.getName() == "Tab1" && r.getColumn() == 1 && r.getValue() == true) {
// Create the record in "Tab2"
var prop = PropertiesService.getDocumentProperties();
var targetSheet = ss.getSheetByName("Tab2");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 2);
s.getRange(row, 2, 1, numColumns).copyTo(target, { contentsOnly: true });
// Insert checkbox cell (already checked)
targetSheet.getRange(target.getRow(), 1).insertCheckboxes().check();
prop.setProperty(row, target.getRow());
} else if (s.getName() == "Tab1" && r.getColumn() == 1 && r.getValue() == "") {
// Remove the row from "Tab2" when the checkbox in "Tab1" is unchecked
var prop = PropertiesService.getDocumentProperties();
var targetRow = prop.getProperty(row);
ss.getSheetByName("Tab2").deleteRow(targetRow);
Logger.log("Deleted the " + targetRow + "row from " + s.getName());
prop.deleteProperty(row);
} else if (s.getName() == "Tab2" && r.getColumn() == 1 && r.getValue() == false) {
// Remove the row from "Tab2" when the checkbox is unchecked and unchecks in "Tab1"
var prop = PropertiesService.getDocumentProperties();
s.deleteRow(row);
// Look the corresponding row in "Tab1"
var keys = prop.getKeys();
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (prop.getProperty(key) == row) {
ss.getSheetByName("Tab1").getRange(key, 1).setValue(false);
prop.deleteProperty(key)
break;
}
}
}
}
一切都按我的预期工作(请参阅下面的用例),除非在 X 行上未选中 Tab1 中的复选框并且未删除 Tab2 中的关联行(通过 PropertiesService)...但它应该是。
用例:
- Tab1 中 X 行的复选框为真 - 将行复制到下一个可用行的 Tab2 [在上面的代码中工作]
- 然后将 Tab1 中 X 行上的复选框设为 false(已将该行复制到 Tab2 中)- 删除 Tab2 中的关联行 [在上面的代码中不起作用]
- 将 Tab2 中 X 行的复选框设为 false - 删除 Tab2 中的行并将 Tab1 中关联行的复选框设为 false [在上面的代码中工作]
理想情况下,上面的代码会更聪明,每一行都有一个唯一的标识符(例如,这可以添加到 A 列中)并且更像是一个关系数据库,因此代码不依赖于行的顺序被维护,例如如果用户希望将来在现有行之间插入新行。
提前感谢您的帮助!
【问题讨论】:
标签: google-apps-script google-sheets checkbox scripting spreadsheet