【问题标题】:Google Scripts: When checkbox true, copy row from sheet A to sheet B. When checkbox false, delete copied row from sheet BGoogle Scripts:当复选框为真时,将工作表 A 中的行复制到工作表 B。当复选框为假时,从工作表 B 中删除复制的行
【发布时间】: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)...但它应该是。

用例:

  1. Tab1 中 X 行的复选框为真 - 将行复制到下一个可用行的 Tab2 [在上面的代码中工作]
  2. 然后将 Tab1 中 X 行上的复选框设为 false(已将该行复制到 Tab2 中)- 删除 Tab2 中的关联行 [在上面的代码中不起作用]
  3. 将 Tab2 中 X 行的复选框设为 false - 删除 Tab2 中的行并将 Tab1 中关联行的复选框设为 false [在上面的代码中工作]

理想情况下,上面的代码会更聪明,每一行都有一个唯一的标识符(例如,这可以添加到 A 列中)并且更像是一个关系数据库,因此代码不依赖于行的顺序被维护,例如如果用户希望将来在现有行之间插入新行。

提前感谢您的帮助!

【问题讨论】:

    标签: google-apps-script google-sheets checkbox scripting spreadsheet


    【解决方案1】:

    我正在尝试复制该问题,是的,我也遇到了您所指的问题。现在,在修改了代码之后,我似乎无法修改并使其工作。甚至修改最后一个条件并使其成为您的第二个条件。

    对我有用的是:

      } else if (s.getName() == "Tab1" && r.getColumn() == 1 && r.getValue() == false) {
        sourceRow = ss.getSheetByName("Tab1").getRange(r.getRow(), 1, 1, ss.getSheetByName("Tab1").getLastColumn()).getValues();
        destData = ss.getSheetByName("Tab2").getDataRange().getValues();    
        destData.forEach(function(item, index){
          tempRow = sourceRow[0];
          tempRow[0] = true;
          if(JSON.stringify(tempRow) === JSON.stringify(item)) {
            ss.getSheetByName("Tab2").deleteRow(index + 1);
          }
        });
    

    所以我确实手动访问了两张纸上的数据。将 Tab2 中的所有行与 Tab1 中的选定行进行比较。

    由于选中的行在捕获后已取消选中,因此我确实创建了一个临时变量来存储选中的行值。然后在 Tab2 中查找它。然后删除 Tab2 中相同的行。

    另外,请注意,上面的 r.getValue() 条件已更新为与 false 值进行比较,而不是空白。

    【讨论】:

    • NaziA 这很好用!谢谢你。对圣诞节的延迟回复表示歉意,今天才开始再次努力。在发布在这里之前,我盯着原始代码看了一天,并且永远不会找到您上面显示的解决方案。我现在将尝试通过尝试将 Tab1 和 Tab2 中的行分组到大约 5 个分类组中来扩展此解决方案。 10.最好的范围蠕变!再次感谢大卫
    • 不客气@DavidSmith,很高兴为您提供帮助。
    猜你喜欢
    • 2019-12-19
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多