谷歌应用程序脚本AppendRow到顶部

Dmi*_*kin 6 javascript google-sheets google-apps-script

我所知

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

所以如果在形式上我有行

  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]);
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*reu 19

没有一个功能可以做到这一点,但写一个并不困难.这是一个例子:

function prependRow(sheet, rowData) {
  sheet.insertRowBefore(1).getRange(1, 1, 1, rowData.length).setValues([rowData]);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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