插入新行并在选定位置复制上一行的公式

时间:2019-08-09 19:52:14

标签: google-apps-script google-sheets

我有一个Google电子表格,其中包含3个表(假设每个表都是5行乘5列)。

当我需要向其中一个表中添加新行时,我只需复制下面该表的最后一行(以便我也可以在新行中包含公式),然后使用新值重新对其进行编辑

但是,我希望有一个更简单的解决方案。我想选择一行,然后运行脚本。该脚本将复制下面的所选行,并使用空值初始化所有单元格。

我已经四处搜寻,但没有发现任何对我有帮助的:(。我发现了一些脚本,它们应该复制最后一行并带有诸如此类的公式:

// global 
var ss = SpreadsheetApp.getActive();

function onOpen() {
  var menu = [{name:"Add New Last Row", functionName:"addRow"}];
  ss.addMenu("Extra", menu);
}

function addRow() {
  var sh = ss.getActiveSheet(), lRow = sh.getLastRow(); 
  var lCol = sh.getLastColumn(), range = sh.getRange(lRow,1,1,lCol);
  sh.insertRowsAfter(lRow, 1);
  range.copyTo(sh.getRange(lRow+1, 1, 1, lCol), {contentsOnly:false});
}

我想从该脚本开始,然后尝试修改脚本以执行我想要的操作。但是,我无法这样做。当我创建一个新脚本并粘贴该代码时,脚本将变为“ unrunnable” :(。我知道onOpen()是一种称为“触发器”的东西,它是某种保留的函数名(或类似名称)。与我的脚本无法运行有关? 请说明如何使复制的脚本像普通脚本一样运行,并向我提供实现所需功能的任何提示(在上面的特定位置添加带有上一行公式的行)。

1 个答案:

答案 0 :(得分:2)

现在,由于您只想更新功能,所以不必担心onOpen,菜单只需运行addRow()。

我将其重写为:

function addRow() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var lr=sh.getLastRow();
  var lc=sh.getLastColumn();
  var rg=sh.getRange(lr,1,1,lc);
  sh.insertRowsAfter(lr, 1);
  rg.copyTo(sh.getRange(lr+1,1,1,lc), {contentsOnly:false});
}

因此,现在您拥有使addRow工作所需的一切。从那里我们可以进一步讨论您想要更改的内容。

此版本使用选定的行而不是最后一行。

function addRow() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var lr=sh.getActiveCell().getRow();
  var lc=sh.getLastColumn();
  var rg=sh.getRange(lr,1,1,lc);
  sh.insertRowsAfter(lr, 1);
  rg.copyTo(sh.getRange(lr+1,1,1,lc), {contentsOnly:false});
}