Forms 使用表单更新google电子表格上的现有数据?

Forms 使用表单更新google电子表格上的现有数据?,forms,google-apps-script,google-sheets,google-sheets-api,Forms,Google Apps Script,Google Sheets,Google Sheets Api,我想建立一个自动系统来更新一些比赛结果以获得冠军。我有一个自动的电子表格,所有的结果都显示出来了,但是我需要花很多时间来更新所有的结果,所以我想知道是否有可能制作一个表格以便更容易地更新它们 在表格中,我将输入车手姓名和他在比赛中赢得的分数。锦标赛每个月有4场比赛,所以是的,我的问题是你们是否知道用表格更新现有数据(存储在电子表格中)的方法。假设在第一场比赛中,车手“X”赢得了10分。我将在表单中插入这些数据,然后从电子表格中调用以显示它,没错。当我想更新第二场比赛的结果时,问题就来了。如果车手

我想建立一个自动系统来更新一些比赛结果以获得冠军。我有一个自动的电子表格,所有的结果都显示出来了,但是我需要花很多时间来更新所有的结果,所以我想知道是否有可能制作一个表格以便更容易地更新它们

在表格中,我将输入车手姓名和他在比赛中赢得的分数。锦标赛每个月有4场比赛,所以是的,我的问题是你们是否知道用表格更新现有数据(存储在电子表格中)的方法。假设在第一场比赛中,车手“X”赢得了10分。我将在表单中插入这些数据,然后从电子表格中调用以显示它,没错。当我想更新第二场比赛的结果时,问题就来了。如果车手“X”在第二场比赛中得了12分,有没有办法更新该车手之前的10分,改为22分?或者我可以自动将第二个比赛结果添加到第一个比赛结果中吗?我的意思是,如果我在表格中插入第二场比赛的结果,它可以查找车手的“X”条目,并将该分数添加到以前的分数中。不知道这是否可能

也许我可以用另一种方式。任何帮助都将不胜感激!
谢谢。

我相信你能找到你想要的一切。
这是一个表单url,当您回答此表单时,您将获得存储数据的电子表格的url。存储的信息之一是修改响应的url,如果您遵循该链接,它将再次打开表单并更新电子表格。执行此技巧的代码位于电子表格的第二页。

这是一个谷歌应用程序脚本代码,需要在表单中关联,并由onFormSubmit触发器触发。

也许我遗漏了你问题中的某些内容,但我不太理解Harold的答案。。。
function onFormSubmit(e) {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2');
  var responses = []
  responses[0] = Number(e.namedValues['race number 1'].toString().replace(/\D/g,''));
  responses[1] = Number(e.namedValues['race number 2'].toString().replace(/\D/g,''));
  responses[2] = Number(e.namedValues['race number 3'].toString().replace(/\D/g,''));
  responses[3] = Number(e.namedValues['race number 4'].toString().replace(/\D/g,''));
  var totals = sh.getRange(2,1,1,responses.length).getValues();
  for(var n in responses){
    totals[0][n]+=responses[n];
  }
  sh.getRange(2,1,1,responses.length).setValues(totals);
}
这是一个严格按照您的要求执行的代码,它计算表单中输入的4个数字的总累积值,并将其显示在电子表格上

我把这4个问题称为“1号种族”、“2号种族”。。。结果出现在第2行,因此您可以设置标题

我去掉了任何非数字字符,这样您可以更自由地键入响应,只保留数字

和(表格1中的原始结果和表格2中的计数

脚本进入电子表格并由onFormSubmit触发器触发

function onFormSubmit(e) {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2');
  var responses = []
  responses[0] = Number(e.namedValues['race number 1'].toString().replace(/\D/g,''));
  responses[1] = Number(e.namedValues['race number 2'].toString().replace(/\D/g,''));
  responses[2] = Number(e.namedValues['race number 3'].toString().replace(/\D/g,''));
  responses[3] = Number(e.namedValues['race number 4'].toString().replace(/\D/g,''));
  var totals = sh.getRange(2,1,1,responses.length).getValues();
  for(var n in responses){
    totals[0][n]+=responses[n];
  }
  sh.getRange(2,1,1,responses.length).setValues(totals);
}

编辑:我更改了代码,允许您轻松更改响应的数量。。。范围将自动更新


编辑2:在结果中使用“如果”条件接受空响应的版本:

function onFormSubmit(e) {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2');
  var responses = []
  responses[0] = Number((e.namedValues['race number 1']==null ? 0 :e.namedValues['race number 1']).toString().replace(/\D/g,''));
  responses[1] = Number((e.namedValues['race number 2']==null ? 0 :e.namedValues['race number 2']).toString().replace(/\D/g,''));
  responses[2] = Number((e.namedValues['race number 3']==null ? 0 :e.namedValues['race number 3']).toString().replace(/\D/g,''));
  responses[3] = Number((e.namedValues['race number 4']==null ? 0 :e.namedValues['race number 4']).toString().replace(/\D/g,''));
  var totals = sh.getRange(2,1,1,responses.length).getValues();
  for(var n in responses){
    totals[0][n]+=responses[n];
  }
  sh.getRange(2,1,1,responses.length).setValues(totals);
}

现在可能太晚了。我相信我们需要一些东西(我没有试过)

  • 映射每个提交响应的唯一键,如用户ID或电子邮件
  • 两个谷歌表单:
    A.请求唯一密钥
    B使用该唯一密钥检索相关数据
    • 创建预填充的URL(请参阅)
    • 从表单中打开URL(请参阅)

  • 非常感谢你的帮助!非常感谢!这是我一直在寻找的,但仍然不是我真正想要的。你给我的脚本将四场比赛的结果相加,但为了做到这一点,我需要同时插入4个结果。我的意思是,如果我每次只插入一个结果,那将非常有用,因为我必须每周更新结果(每个月4场比赛)。请随意描述更多细节,以便我更好地理解:-)还有一件事。如果我有13个驱动程序,是否可以选择要在表格中插入的驱动程序结果,或者我需要为每个驱动程序插入4个表格问题?这就是为什么我说,如果可以使用表格编辑电子表格的内容,原因是如果可能,我将在第一周插入1号、2号和3号车手的race1结果,然后插入他们的race2结果,但只是更新之前的结果或将其相加。无法及时编辑第一个答案,抱歉。再次非常感谢你,Serge!:D当然你可以。。。那么会有5个问题?问题1是司机的名字?他们是如何在SS上显示的?注意,没有答案是强制性的,所以你可以留下一些空白的问题…我想这不会导致错误。。。待测试…谢谢哈罗德的回答!这就是为什么我不期待,我的意思是,这并不完全是我想要的,因为我可以编辑结果,但我必须手动更新所有结果(添加冠军每一场比赛的每个车手的分数)。嗨,哈罗德。我认为您的解决方案几乎就是我需要将工作表中的记录与表单相关联的解决方案。但是当我在工作表中,单击表单链接,编辑一些内容,然后按submit,您的解决方案将创建一个新记录。我更喜欢的解决方案是,每个记录都有一个指向表单的链接,编辑表单会更新记录。这可能吗?@christopher Hi,我相信这正是它应该做的,但不知怎么的,它已经不起作用了。我会在下周解决这个问题。我这周要去旅行。两年半前,你写了一个关于堆栈溢出的答案,现在我请你提供技术支持!谢谢你,哈罗德!我真的很感激。@ChristopherBerby完成了我已经更新了脚本,它应该可以正常工作了