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