我想将一些数据从一个电子表格复制到另一个电子表格。第一个变量的大小经常发生变化,第二个变量在第一个变量中有几列,然后在其他一些列中包含它自己的数据。
我想在第二个中插入/删除行,这取决于在第一个中插入或删除的行。它们必须与之前的数据相匹配。
我尝试使用onChange触发器来检测何时检测到INSERT_ROW或REMOVE_ROW changeType。当只插入一行时,它工作得很好,但当他们插入多行时就不行了。此外,当用户插入行并撤消操作后,changeType是EDIT而不是REMOVE_ROW。失败。
然后我决定添加一个隐藏列,每行都有一个索引号,所以如果在第5行和第6行之间有一个数字间隙,这意味着我必须在第5行之后的第二个工作表中插入3行,然后我重建索引以检查进一步的更改……如果删除了几行,它也会起作用。
这种方式似乎工作得很好,直到我意识到用户可以复制行或复制/粘贴整行,然后使用新信息修改数据,但索引也被复制,当我检查差异以检查是否有行被删除时,它就失败了。
第一次尝试:
if (event.changeType == 'INSERT_ROW' && tab =='Hoja 1') {
for (var i = 0 ; i < indexes.length ; i++) {
if (indexes[i] =='') {
destSheet.insertRowAfter(i+1);
}
}
}
if (event.changeType == 'REMOVE_ROW' && tab =='Hoja 1') {
for (var i = 0 ; i < indexes.length ; i++) {
if (indexes[i]-indexes[i+1] < -1 && indexes[i] != 0) {
if (indexes[i] != lastRow) {
destSheet.deleteRows(i+3,(indexes[i]-indexes[i+1])*-1-1)
}
}
}
}
for (var j = 0; j < lastRow-1; j++) {
indexs.getCell(j+1, 1).setValue(j+1);
}
}
第二次尝试:
function checkLines (sheet, destSheet) {
for (var i = 0 ; i < indexes.length ; i++) {
if (indexes[i] =='') {
destSheet.insertRowAfter(i+1);
}
if (indexes[i]-indexes[i+1] < -1 && indexes[i] != 0) {
if (indexes[i] != lastRow) {
destSheet.deleteRows(i+3,(indexes[i]-indexes[i+1])*-1-1)
}
}
}
}
我希望在目标工作表中有源工作表的选定列的副本,如果第一个更改了它的行,那么第二个也应该发生同样的事情。
在某些情况下,目标不会实现,然后下一列中写入的信息与第一列中的信息不匹配。
下面是源表示例的链接:https://docs.google.com/spreadsheets/d/19OnwKIEm2OFymjsjqeoQYWcA9BNAJTM0ap2rdpQlZoQ/edit?usp=sharing
这里是目的地:https://docs.google.com/spreadsheets/d/10vbMIqQE1miNfuJXQ1f_MSJnVs9MJrAOcg5_ZrAPWP8/edit?usp=sharing
如果有任何建议,我将不胜感激。如果你需要进一步的解释,请告诉我。英语不是我的母语,我不确定你是否理解我的问题。
非常感谢。
V。
发布于 2019-03-29 06:34:57
您可以使用类似以下内容:
function initRows() {//run once before first use
var lastrow=SpreadsheetApp.getActiveSheet().getLastRow();
PropertiesService.getScriptProperties().setProperty('ROWS',lastrow);
return lastrow;
}
function getRows() {
return PropertiesService.getScriptProperties().getProperty('ROWS');
}
function setRows(value) {
PropertiesService.getScriptProperties().setProperty('ROWS',value);
}
function detectRowChange(e) {//attach to onChange installable trigger
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var number=Math.abs(getRows()-sh.getLastRow());
var html=Utilities.formatString('Change Type: %s Number: %s', e.changeType,number);
var ui=HtmlService.createHtmlOutput(html);
SpreadsheetApp.getUi().showModelessDialog(ui, 'Change');
setRows(sh.getLastRow());
}
这利用一个对话框来标识更改的类型和受影响的行数。您可能希望根据自己的特定需求对其进行自定义。在设置触发器之前,不要忘记运行initRows()。
https://stackoverflow.com/questions/55406054
复制相似问题