Google 应用程序脚本 AppendRow 到顶部

Google apps script AppendRow to the top

据我所知

appendRow(rowContents) add values to the bottom of the spreadsheet But how to add data from form in multiple rows in top of spreadsheet?

所以如果表格中有行

  1. first, surname, name
  2. second, surname, name
  3. third, surname, name

在sheet里面一定要放一样,而且每次都顶

所以如果下一次表格会是

  1. fourth, surname, name
  2. fifth, surname, name
  3. six, surname, name

数据将像

一样添加

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

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

没有一个函数可以做到这一点,但写一个并不难。这是一个例子:

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

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

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

但是appendRow还有一个有趣的特点,那就是concurrent-safe。这意味着它可以并行触发多次并且不会搞砸。为了让我们的函数并发安全,你必须 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
}