首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用onChange触发器确定在工作表中插入的行数?

如何使用onChange触发器确定在工作表中插入的行数?
EN

Stack Overflow用户
提问于 2019-03-29 04:08:15
回答 1查看 508关注 0票数 0

我想将一些数据从一个电子表格复制到另一个电子表格。第一个变量的大小经常发生变化,第二个变量在第一个变量中有几列,然后在其他一些列中包含它自己的数据。

我想在第二个中插入/删除行,这取决于在第一个中插入或删除的行。它们必须与之前的数据相匹配。

我尝试使用onChange触发器来检测何时检测到INSERT_ROW或REMOVE_ROW changeType。当只插入一行时,它工作得很好,但当他们插入多行时就不行了。此外,当用户插入行并撤消操作后,changeType是EDIT而不是REMOVE_ROW。失败。

然后我决定添加一个隐藏列,每行都有一个索引号,所以如果在第5行和第6行之间有一个数字间隙,这意味着我必须在第5行之后的第二个工作表中插入3行,然后我重建索引以检查进一步的更改……如果删除了几行,它也会起作用。

这种方式似乎工作得很好,直到我意识到用户可以复制行或复制/粘贴整行,然后使用新信息修改数据,但索引也被复制,当我检查差异以检查是否有行被删除时,它就失败了。

第一次尝试:

代码语言:javascript
复制
  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);
  }
}

第二次尝试:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2019-03-29 06:34:57

您可以使用类似以下内容:

代码语言:javascript
复制
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()。

PropertiesService

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55406054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档