在表单提交时将最后一行复制到另一个电子表格

时间:2014-10-14 10:17:43

标签: google-apps-script google-sheets

我有一个带有附加组件的Google电子表格,该附加组件从表单中获取数据并在表单提交时运行。我还有另一个附加组件,可以将此电子表格中的数据推送到另一个电子表格 - 让我们在这里称之为spreadsheet2。在spreadsheet2中,我有自己的脚本,其函数copyLastRow()将此电子表格的最后一行复制到另一个电子表格 - 让我们称之为电子表格3。我的脚本应该从spreadsheet2到电子表格3附加一个新行。它在我手动运行时运行正常,但它没有通过项目触发器运行 - 我为脚本编辑器安装了资源 - 我在编辑和更改触发器上都尝试过,但它们在数据时根本不启动从电子表格2推送。当我实际编辑电子表格2时,脚本正在运行。但是,这对我需要的东西并不好 - 我真的需要脚本才能在没有人工干预的情况下工作。求你帮忙吗?

function copyLastRow() {  
var target = SpreadsheetApp.openById('xxxxxxxxx').getSheetByName('Sheet1');
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var lastrow = sheet.getLastRow();
var sourceData = sheet.getRange(lastrow, 1, 1, 53).getValues();
target.appendRow(sourceData[0]);
编辑:我更新了代码 - 我意识到我在这里留下了以前版本的代码。

1 个答案:

答案 0 :(得分:2)

当多个用户提交表单时,您是否有权担心此功能是否有效......它不会成为现实。但它很容易改进。

问题是什么?运行copyLastRow()时,它会假定源电子表格的最后一行包含也触发该功能的响应。但是,在它开始阅读该行之前,另一个用户可能会提交表单。 (最终,该功能也将由该提交触发,并且可以再次处理同一行。)

这种情况的最简单的改进是利用提供给触发器函数的事件对象作为参数。有关背景详细信息,请参阅Google Sheet Events

新提交的回复位于event.values,这是一个数组 - 正是.appendRow()所需要的。以下是我们如何更新您的copyLastRow功能:

function copyLastRow(event) {  
  var target = SpreadsheetApp.openById('xxxxxxxxx').getSheetByName('Sheet1');
  target.appendRow(event.values);
}

现在提交表单的用户数量并不重要 - 每个用户都将通过此功能进行唯一处理。