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)未被删除之外,所有工作都完全按照我的预期进行(请参见下面的用例)。。。但应该是这样
用例:
理想情况下,上面的代码会更聪明,每一行都会有一个唯一的标识符(例如,可以添加到列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,很高兴能帮上忙。