【问题标题】:Speed up Add Row function加速添加行功能
【发布时间】:2020-05-25 23:38:09
【问题描述】:

我有以下“添加行”Google Apps 脚本,当用户单击按钮时触发:

//Add Row to Additional Duties Sheet
function AddRowtoAdditionalDutiesSheet() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('3:3').activate();
  spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getActiveRange().getRow(), 1);
  spreadsheet.getActiveRange().offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
  spreadsheet.getRange('A4:X4').activate();
  spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('A3:X4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  spreadsheet.getRange('3:3').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, commentsOnly: true, skipFilteredRows: true});
  spreadsheet.getRange('G4:K4').activate();
  spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('G3:K4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  spreadsheet.getRange('F4').activate();
  spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('F3:F4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  spreadsheet.getRange('R4').activate();
  spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('R3:R4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  spreadsheet.getRange('X4').activate();
  spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('X3:X4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  spreadsheet.getRange('A3').activate();
}

这是我的工作表的副本,其中包含 A 到 X 列。

脚本在插入行后将某些单元格中的公式从第 4 行复制到第 3 行。问题是有很多用户填充工作表,有时公式没有粘贴到第 3 行。经过大量观察,我相信这是因为 2 个不同的用户同时单击按钮,脚本也是慢慢粘贴公式。有没有更好的方法来编写脚本以使其更快?

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    这个答案怎么样?

    修改点:

    • 为了降低脚本的处理成本,我把getActiveRange()换成了范围。
    • 为了持续运行脚本,我设置了LockService。
      • 这样,当按钮被多个用户点击时,脚本被锁定,每个用户运行的每个脚本都可以独占处理运行。

    修改后的脚本:

    function AddRowtoAdditionalDutiesSheet() {
      var lock = LockService.getDocumentLock();
      if (lock.tryLock(10000)) {
        try {
    
          // your script
          var spreadsheet = SpreadsheetApp.getActive();
          spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getRange('3:3').getRow(), 1);
          spreadsheet.getRange('3:3').offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
          spreadsheet.getRange('A4:X4').autoFill(spreadsheet.getRange('A3:X4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
          spreadsheet.getRange('3:3').clear({contentsOnly: true, commentsOnly: true, skipFilteredRows: true});
          spreadsheet.getRange('G4:K4').autoFill(spreadsheet.getRange('G3:K4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
          spreadsheet.getRange('F4').autoFill(spreadsheet.getRange('F3:F4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
          spreadsheet.getRange('R4').autoFill(spreadsheet.getRange('R3:R4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
          spreadsheet.getRange('X4').autoFill(spreadsheet.getRange('X3:X4'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
          spreadsheet.getRange('A3').activate();
    
        } catch(e) {
          throw new Error(e);
        } finally {
          lock.releaseLock();
        }
      }
    }
    

    注意:

    • 在您的脚本中,我认为仅使用锁定服务,您的问题可能会得到解决。

    参考:

    【讨论】:

    • 非常感谢 Tanaike - 这是一个聪明的主意。它可以按我的意愿工作,但真正的测试将在下周一早上同时有 10 个用户。
    • @McChief 感谢您的回复。如果在使用10个用户时出现错误,虽然我不确定这是否是它的直接解决方案,例如,增加10000if (lock.tryLock(10000)) {}怎么样?
    • 某些单元格有时仍无法粘贴。我还注意到 LockService 没有激活锁。
    • @McChief 感谢您的回复。我愿意支持你。但是关于certain cells are still not pasting sometimes. I also noticed that the LockService is not activating the lock.,我无法复制你的情况。因为在我的测试中,我看不到和你一样的情况。在现阶段,我认为需要更多的信息来思考当前的问题。因此,通过包含复制当前问题的详细信息,您可以将其作为新问题发布吗?通过这个,我想确认并测试它。如果您能合作解决您的问题,我很高兴。
    • @McChief 感谢您的快速回复。我想从你的新问题中确认一下情况。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 2020-05-02
    • 2015-02-18
    • 2010-12-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多