【问题标题】:Google sheet script auto add new rows with copied formulas谷歌工作表脚本自动添加带有复制公式的新行
【发布时间】:2022-01-21 09:27:00
【问题描述】:

我需要创建一个函数,该函数使用从上面的行复制的公式添加行。脚本启动后,它应该会在工作表末尾产生准确的空白行数(在此代码中设置 5)。

我设法创建的代码计算了应添加的行数,但最后只添加了一行复制的公式。

请帮我编辑这段代码,通过“rowstoadd”参数将函数的结果倍增。

Sheet image

function autoaddRows() {

  var sheet = SpreadsheetApp.getActive().getSheetByName('Harmonogram');
  var range = sheet.getRange("B2:B").getValues();
  var lastRowB = range.filter(String).length + 2;
  var lastRowA = sheet.getLastRow();
  var blanknrows = sheet.getLastRow() - lastRowB;
  if (blanknrows < 5) {
    let rowstoadd = 5 - blanknrows;
    Browser.msgBox(rowstoadd);
    let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    let lastRowIndex = sheet.getLastRow();
    let existingRange = getRowRange(sheet, lastRowIndex);

    sheet.insertRowAfter(lastRowIndex);
    let newRange = getRowRange(sheet, ++lastRowIndex);

    existingRange.copyTo(newRange);
    newRange.setFormulas(newRange.getFormulas());
    newRange.clearNote();
  }
  
  function getRowRange(sheet, rowIndex) {
    return sheet.getRange(rowIndex, 1, 1, sheet.getLastColumn());
  }
}

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,我无法理解Please help me edit this code to multiple the result of the function by "rowstoadd" parameter.。可以问一下具体情况吗?
  • 现在这段代码增加了 1 行。我需要对其进行编辑以添加由“rowstoadd”参数计算的行数。如果你看左边的图片,最后有一个空白行。 “Blankrow”参数设置为5,所以我希望脚本添加4行(由“rowstoadd”参数计算)。
  • 感谢您的回复。从您的脚本中,我无法理解"Blankrow" parameter is set on 5。可以问一下具体情况吗?
  • "blanknrows
  • 感谢您的回复。根据您的回复,我提出了一个修改后的脚本作为答案。你能确认一下吗?如果我误解了您的问题并且没有用,我深表歉意。

标签: javascript google-apps-script google-sheets


【解决方案1】:

我相信你的目标如下。

  • 您想保留 5 个新的空行。
  • 例如,当“A”列的最后一行为 10,“B”列的最后一行为 9 时,您要添加 4 个新行。
  • 此外,您希望将公式放入插入行的“B”列。

这样的话,下面修改的脚本怎么样?

修改后的脚本:

function autoaddRows() {
  var addRows = 5;
  var sheet = SpreadsheetApp.getActive().getSheetByName('Harmonogram');
  var range = sheet.getRange("B2:B").getValues();
  var lastRowB = range.filter(String).length + 1;
  var lastRow = sheet.getLastRow();
  var blanknrows = lastRow - lastRowB;
  var diff = addRows - blanknrows;
  if (diff > 0) {
    sheet.insertRowsAfter(lastRow, diff);
    // var range = sheet.getRange("B" + lastRowB);
    // range.copyTo(range.offset(1, 0, diff + 1), SpreadsheetApp.CopyPasteType.PASTE_FORMULA, false);
    var numberOfCol = sheet.getLastColumn() - 1;
    var range = sheet.getRange(lastRowB, 2, 1, numberOfCol);
    range.copyTo(range.offset(1, 0, diff + 1, numberOfCol), SpreadsheetApp.CopyPasteType.PASTE_FORMULA, false);
    range.clearNote();
  }
}
  • 在此修改中,检索列“A”和列“B”之间的最后一行之间的差异。并使用差异插入空行。
  • 在您的脚本中,使用了newRange.clearNote();。所以,我也加了range.clearNote();。如果您想删除它,请删除它。

参考资料:

【讨论】:

  • 这几乎是完美的 :) 但是看看附上的图片(在左边 --> 之前)并想象 B5 有公式导致空白单元格。现在脚本只复制 B 列中的最后一个值。(addrows=5 它显示 5 行“3M 22 02 2022”)它应该复制整个第一个空白行,其中包含单元格中的公式 - 不仅是 B 列。
  • @Michał Kostrzewa 感谢您的回复。我带来的不便表示歉意。从It should copy the the whole first blank row with formulas in cells - not only column B.,我更新了我提议的脚本。你能确认一下吗?如果我在您的回复中误解了您的实际目标,我再次道歉。届时,您能否提供用于复制问题的示例电子表格?借此,我想确认一下。
  • 通过我的小改动,它可以满足我的需要。太感谢了! (var range = sheet.getRange(lastRowB+1, 2, 1, numberOfCol);)
  • @Michał Kostrzewa 感谢您的回复。我很高兴你的问题得到了解决。关于One more thing. How it should be modified to copy row with formating (specially with coloured borders in cells)? 的新问题,将range.copyTo(range.offset(1, 0, diff + 1, numberOfCol), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); 放在range.clearNote(); 行之前怎么样?如果我误解了您的新问题,我深表歉意。
  • 我提出了一个新问题:stackoverflow.com/questions/70811101/… 我是一名业余爱好者,试图通过 google 表格改进我的工作。我没有开发人员知识。这一切都基于阅读这个论坛并尝试不同的解决方案。在这种情况下,我不明白为什么脚本第一次而不是第二次起作用。我尝试更改数值参数,但到目前为止我还没有找到解决方案。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多