【问题标题】:Google apps script AppendRow to the topGoogle 应用程序脚本 AppendRow 到顶部
【发布时间】:2015-02-03 09:08:42
【问题描述】:

据我所知

追加行(行内容) 将值添加到电子表格的底部 但是如何在电子表格顶部的多行中添加表单中的数据?

所以如果在表单中我有行

  1. 名,姓,名
  2. 二、姓、名
  3. 三、姓、名

在工作表中必须放置,并且每次都放在顶部

所以如果另一个时间在表格中

  1. 四、姓、名
  2. 五、姓、名
  3. 六、姓、名

数据会像这样添加

现在我使用此代码,但它将所有数据附加到末尾并且仅适用于一行,我认为我必须循环遍历表单中的所有行但是如何做到这一点?

function getValuesFromForm(form){
  var firstName = form.firstName,
      lastName = form.lastName,
      order = form.order,
      sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow([order,lastName,firstName]);
}

【问题讨论】:

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


    【解决方案1】:

    没有单一的功能可以做到这一点,但编写一个并不难。这是一个例子:

    function prependRow(sheet, rowData) {
      sheet.insertRowBefore(1).getRange(1, 1, 1, rowData.length).setValues([rowData]);
    }
    

    我实际上允许一个可选的索引,假设我们要在第二行之后插入,跳过标题。

    function insertRow(sheet, rowData, optIndex) {
      var index = optIndex || 1;
      sheet.insertRowBefore(index).getRange(index, 1, 1, rowData.length).setValues([rowData]);
    }
    

    但是appendRow 还有另一个有趣的特性,它是并发安全的。这意味着它可以并行触发多次并且不会搞砸。为了使我们的函数并发安全,您必须 lock 它,如下所示:

    function insertRow(sheet, rowData, optIndex) {
      var lock = LockService.getScriptLock();
      lock.waitLock(30000);
      try { 
        var index = optIndex || 1;
        sheet.insertRowBefore(index).getRange(index, 1, 1, rowData.length).setValues([rowData]);
        SpreadsheetApp.flush();
      } finally {
        lock.releaseLock();
      }
    }
    

    然后,要在您的代码中使用它,只需调用..

    function getValuesFromForm(form){
      //...
      insertRow(sheet, [order,lastName,firstName]); //could have passed an extra `2` parameter to skip a one line header
    }
    

    【讨论】:

    • 您好,感谢@HenriqueAbreu!我只需要在顶部添加一行,所以我想使用上面脚本的主要部分。但我看不到在哪里引用我在脚本中处理的工作表/选项卡?你能帮帮我吗?谢谢!
    • @Drewdavid 建议的函数将sheet 作为第一个参数,只需在您的脚本中获取它,就像您经常使用的那样(例如SpreadsheetApp.getActive().getSheetByName('whatever')
    • 确保将传递给 insertRow 的 rowData 转换为嵌套数组,否则该函数将不起作用: function insertRow(sheet, rowData, optIndex) { var lock = LockService.getScriptLock(); lock.waitLock(30000);尝试 { var index = optIndex || 1个; sheet.insertRowBefore(index).getRange(index, 1, 1, rowData.length).setValues(new Array(rowData)); SpreadsheetApp.flush(); } 最后 { lock.releaseLock(); } }
    • 谢谢。你是对的。我错过了。将解决答案
    猜你喜欢
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多