谷歌表格添加按钮以插入具有公式的新行。

3

这是我的数据的简化版本。我想在灰色区域底部放置一个按钮,点击后,在底部上方插入一行新行。新行必须具有与其前面的行相同的公式。

enter image description here 我的真实公式非常复杂,因此我无法使用ArrayFormula来满足新行中的数据。 这是我的电子表格链接。


请注意,如果您插入一行,则下面的公式可能会出错,就像您工作表中的B列一样。 - Mike Steelson
@MikeSteelson,你能把你的建议作为答案或者在表格中发送吗? - Salar
好的,完成了...现在,我会非常好奇如何通过arrayformula甚至在复杂情况下找到解决方案。 - Mike Steelson
2个回答

3
您可以参考此示例代码,使用自定义菜单插入基于上一行的公式的新行。

代码:

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  // Or DocumentApp or FormApp.
  ui.createMenu('Custom Menu')
      .addItem('Insert New Row', 'insertRow')
      .addToUi();
}

function insertRow() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();

  //Exit function if current active sheet is not Sheet1
  if(sheet.getName() != "Sheet1"){
    return;
  }

  //insert new row
  sheet.insertRowAfter(lastRow);
  sheet.getRange(lastRow,2,1,3).copyTo(sheet.getRange(lastRow+1,2));
}

它是做什么的?

  1. 使用getLastRow()getLastColumn()获取活动工作表中具有内容的最后一行和最后一列
  2. 使用insertRowAfter(afterPosition)在具有内容的最后一行之后插入新行
  3. 使用getRange(row, column, numRows, numColumns)获取具有内容的最后一行的范围

其中:

row=您具有内容的最后一行

column=要开始的列索引(在示例表格中为B列/索引2)

numRows =应该为1(我们只想复制当前具有内容的最后一行)

numCols =要选择的列数。在示例表格中,有3列(B-D列)

  1. 使用copyTo(destination)复制步骤3中选择的范围的值和格式,并将其粘贴到新添加的行中。目标范围应为左上角单元格。因为我们想将其复制到新行,所以我使用了getRange(last row+1, 2)

输出:

enter image description here

注意:

  • 如果您想使用放置在灰色行下面的按钮,请在分配脚本时使用insertRow

  • 请确保具有内容的最后一行是具有公式的行。


如果您想在指定的工作表列表上使用该函数,可以将其添加到示例代码中。如果当前活动工作表名称不包含在有效工作表列表中,则会退出该函数

  var validSheets = ["Sheet1", "Sheet2"];

  if(!validSheets.includes(sheet.getName())){
    return;
  }

请告诉我如果您遇到了问题,这样我就可以相应地更新答案。 - Ron M
我的 Google 表格可能有多个工作表。我该如何限制此功能仅插入指定的工作表中? - Salar
我更新了答案以添加工作表名称检查。只需将“Sheet1”替换为您指定的工作表名称即可。 - Ron M

1

删除最后一条评论...然后点击新菜单:此脚本将在活动工作表中添加一行新内容

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('>> Action <<')
    .addItem('Copy last row (formulas only)', 'copyLastRow')
    .addToUi();
}
function copyLastRow() {
  var sh=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var rng=sh.getRange(sh.getLastRow(),1,1,sh.getLastColumn())
  rng.copyTo(sh.getRange(sh.getLastRow()+1,1,1,sh.getLastColumn()), SpreadsheetApp.CopyPasteType.PASTE_FORMULA, false)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接