Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google应用程序脚本将行追加到顶部_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript Google应用程序脚本将行追加到顶部

Javascript Google应用程序脚本将行追加到顶部,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,据我所知 appendRow(行内容) 将值添加到电子表格的底部 但如何从电子表格顶部的多行表单中添加数据呢 所以如果在形式上我有行 第一,姓氏,名字 第二,姓、名 第三,姓氏、姓名 在板材中,必须将其放置为,每次放置到顶部 所以如果下一次在形式上 第四,姓氏、姓名 第五,姓、名 六、姓氏、姓名 数据将按如下方式添加 现在我使用这段代码,但它将所有数据追加到末尾,并且只对一行有效,我认为我必须循环遍历表单中的所有行,但如何做到这一点 function getValuesFromForm(fo

据我所知

appendRow(行内容) 将值添加到电子表格的底部 但如何从电子表格顶部的多行表单中添加数据呢

所以如果在形式上我有行

  • 第一,姓氏,名字
  • 第二,姓、名
  • 第三,姓氏、姓名
  • 在板材中,必须将其放置为,每次放置到顶部

    所以如果下一次在形式上

  • 第四,姓氏、姓名
  • 第五,姓、名
  • 六、姓氏、姓名
  • 数据将按如下方式添加

    现在我使用这段代码,但它将所有数据追加到末尾,并且只对一行有效,我认为我必须循环遍历表单中的所有行,但如何做到这一点

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

    没有一个函数可以实现这一点,但编写一个函数并没有那么困难。下面是一个例子:

    函数前置行(工作表,行数据){
    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
    还有另一个有趣的特性,它是并发安全的。这意味着它可以被并行触发多次,并且不会出错。为了使我们的函数并发安全,您必须
    锁定它,如下所示:

    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建议的函数将
    工作表
    作为第一个参数,只需在脚本中获取它,就像您经常使用的那样(例如
    SpreadsheetApp.getActive().getSheetByName('whatever')
    ),请确保将传递给insertRow的行数据转换为嵌套数组,否则函数将无法工作: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(新数组(rowData));SpreadsheetApp.flush();}最后{lock.releaseLock();}谢谢。你说得对。我错过了。我会解决这个问题的