Google apps script Google脚本:如果复选框为true,则将行从工作表A复制到工作表B。如果复选框为false,则从工作表B删除复制的行

Google apps script Google脚本:如果复选框为true,则将行从工作表A复制到工作表B。如果复选框为false,则从工作表B删除复制的行,google-apps-script,google-sheets,checkbox,scripting,spreadsheet,Google Apps Script,Google Sheets,Checkbox,Scripting,Spreadsheet,我对谷歌脚本非常陌生,应该先学习一些基础知识,但我直接开始尝试为朋友解决一个问题。我在网上找到了这段代码,这是我想要实现的完美解决方案,但是,以下代码片段似乎导致了问题,并且没有执行其预期功能: } else if (s.getName() == "Tab1" && r.getColumn() == 1 && r.getValue() == "") { // Remove the row from "Tab

我对谷歌脚本非常陌生,应该先学习一些基础知识,但我直接开始尝试为朋友解决一个问题。我在网上找到了这段代码,这是我想要实现的完美解决方案,但是,以下代码片段似乎导致了问题,并且没有执行其预期功能:

} 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;
        }
    }
}
函数onEdit(事件){
//假定源数据位于名为“Tab1”的工作表中
//移动到名为“Tab2”的目标工作表
//带有复选框的getColumn当前设置为colu 1或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());
如果(s.getName()==“Tab1”&&r.getColumn()==1&&r.getValue()==true){
//在“Tab2”中创建记录
var prop=PropertiesService.getDocumentProperties();
var targetSheet=ss.getSheetByName(“Tab2”);
var target=targetSheet.getRange(targetSheet.getLastRow()+1,2);
s、 getRange(行,2,1,numColumns).copyTo(目标,{contentsOnly:true});
//插入复选框单元格(已选中)
targetSheet.getRange(target.getRow(),1.InsertCheckBox().check();
prop.setProperty(row,target.getRow());
}否则如果(s.getName()==“Tab1”&&r.getColumn()==1&&r.getValue()==”){
//取消选中“Tab1”中的复选框时,从“Tab2”中删除该行
var prop=PropertiesService.getDocumentProperties();
var targetRow=prop.getProperty(行);
ss.getSheetByName(“Tab2”).deleteRow(targetRow);
Logger.log(“从“+s.getName()”中删除了“+targetRow+”行);
删除属性(行);
}else if(s.getName()==“Tab2”&&r.getColumn()==1&&r.getValue()==false){
//取消选中复选框并取消选中“Tab1”中的复选框时,从“Tab2”中删除该行
var prop=PropertiesService.getDocumentProperties();
s、 删除行(row);
//查看“表1”中的相应行
var keys=prop.getKeys();
对于(变量i=0;i
}

除了在X行中取消选中Tab1中的复选框,并且Tab2中的关联行(通过PropertiesService)未被删除之外,所有工作都完全按照我的预期进行(请参见下面的用例)。。。但应该是这样

用例:

  • Tab1中X行上的复选框为true-将行复制到下一行的Tab2中[在上面的代码中工作]
  • 然后将Tab1中X行上的复选框设为false(该行已复制到Tab2中)-删除Tab2中的关联行[不在上面的代码中工作]
  • 将Tab2中X行的复选框设为false-删除Tab2中的行,并将Tab1中关联行的复选框设为false[在上面的代码中工作]

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


    提前感谢您的帮助

    我正试图复制这个问题,是的,我也经历了您所指的问题。现在,在对代码进行了一些修改之后,我似乎无法修改并使其工作。甚至修改最后一个条件并使其作为第二个条件工作

    对我有效的是:

      } 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中的选定行进行比较

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


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

    NaziA此操作非常有效!非常感谢。为圣诞节期间的延迟回复表示歉意,今天我又抽出时间来做这件事。在这里发布之前,我已经盯着原始代码看了一天了,我永远也不会想到上面显示的解决方案。我现在将尝试扩展这个解决方案,尝试将Tab1和Tab2中的行分组为大约10的分类组。范围蠕变在它最好的!再次感谢,大卫欢迎@DavidSmith,很高兴能帮上忙。