是否可以在Google表单中为其插入电子表格的每一行以及时间戳赋予唯一值?

评论

创建表单时,会自动添加AFAIK时间戳。当您查看电子表格列中的内容时,第一个通常是时间戳记(除非出于某种原因将其删除,否则我真的不知道会发生什么情况)

我猜自从给出答案以来,情况有所改变,因为在创建触发器并将代码添加到脚本之后,提交表单时没有任何反应。是否有人对上述解决方案在新版Google Sheeth上的使用有任何建议?

#1 楼

您可以通过添加脚本触发器来做到这一点。

假设您当前的Form有两列Timestamp和一个问题的答案。因此,您当前在A和B列中填充了数据。假设您希望C列具有自动递增编号。

首先需要转到Tools> Script Editor

在“脚本编辑器”窗口中,输入以下脚本:

function onFormSubmit(e) {

var sheet = SpreadsheetApp.getActiveSheet();
var row =  SpreadsheetApp.getActiveSheet().getLastRow();

sheet.getRange(row,3).setValue(row);


}


保存脚本,然后转到Triggers菜单并选择Current script's triggers

按如下所示填充下拉列表:



单击Save

,然后保存并关闭Google App脚本窗口。

现在,当您提交表单时,它将填充行号在C列中以及通过表单提交的数据。

要更改保存行号的列,您需要更改脚本的这一行:

sheet.getRange(row,3).setValue(row);

,并将值3更改为相应的列索引号。

评论


是否可以使用此脚本,但是我需要一个唯一的编号,这样,如果我删除或添加一行,就不会搞砸它的示例:我有ID或行1、2、3、4、5、6,但我手动删除表单提交ID 5之后的5将移至第5行,因此表单提交的下一个ID将再次为6。那么是否可以使用时间戳并从中制作一个唯一的自动递增数字?

–user17492
2012年2月19日在20:02



更好的是,我现在使用它向所有数据控制的URL发出get请求,并将其直接放入我的应用中

– Toby Allen
2012年3月16日17:24

#2 楼

除了Barry的出色答案之外,如果您希望能够删除行并仍然保留唯一ID,则可以使用一个静态单元格来维护计数。然后,您可以使用此数字,并在表的每个新条目上递增该数字。代码如下所示:

function onFormSubmit(e) 
{
   var sheet = SpreadsheetApp.getActiveSheet();
   var row =  SpreadsheetApp.getActiveSheet().getLastRow();

   var bugCount = sheet.getRange("M1").getValue();
   bugCount++;

   sheet.getRange(row,1).setValue(bugCount);
   sheet.getRange("M1").setValue(bugCount);
}


再次更改第二行,以更改ID的放置位置。

评论


我已经应用了此方法,但是在删除数据行之间的行的情况下这并不成功。所以每当删除行时它应该更新隐藏值

–user21264
2012年6月19日在8:12

如果仅需要唯一的ID(按照原始问题),则不需要删除该编号。如果减少删除值,您将获得重复的ID。

–丹尼·帕克(Danny Parker)
2012年6月22日14:00

#3 楼

基于先前的两个答案(来自Barry和Danny):

假定ID列为A列。选择一个“下一个ID”单元格并将其设置为以下公式(假设它位于“ P1”中) ):

=MAX(A:A)+1


使用“工具”菜单下的脚本编辑器创建脚本,并粘贴以下内容:

function onFormSubmit(e) {
  // Get the active sheet
  var sheet = SpreadsheetApp.getActiveSheet();
  // Get the active row
  var row = sheet.getActiveCell().getRowIndex();
  // Get the next ID value.  NOTE: This cell should be set to: =MAX(A:A)+1
  var id = sheet.getRange("P1").getValue();
  // Check of ID column is empty
  if (sheet.getRange(row, 1).getValue() == "") {
    // Set new ID value
    sheet.getRange(row, 1).setValue(id);
  }
}


使用脚本编辑器中的“触发器”菜单添加脚本触发器:


评论


使用此答案,删除行可能导致重复的ID。我们可以根据事实ID来假定它们将在一个电子表格之外的其他进程中使用。或者,如果删除一行并随后需要恢复该怎么办?

–腰包
20-4-6在16:58



#4 楼

除了上述答案之外-此解决方案不需要额外的电子表格单元格。

您可以使用内置事件处理程序提交表单以获得唯一ID。因为电子表格只是表单的目的地,所以删除行实际上并不会删除响应。考虑到这一点...

编辑:消除了对ID的需要,并处理了日期格式问题。




评论


我不明白提交表单后如何调用?

–科迪·布格斯坦(CodyBugstein)
2015年9月11日18:00

@Imray:我认为这必须是电子表格中的脚本。您可以在电子表格中设置触发器,以在提交表单时运行功能。如果可行,我将在该答案中添加该事实(我需要检查)。

–加里·谢泼德(Gary Sheppard)
16年1月28日在13:20

通过简单地将响应的长度返回到日期,可以大大简化getUniqueID函数(这就是上述函数的逻辑以相当复杂的方式进行的操作)。函数中基本上是一行:return getConnectedForm()。getResponses()。length;

–阿比德·穆塔巴(Abid H. Mujtaba)
16-2-6在16:33



如果删除响应导致重复的ID,则@ AbidH.Mujtaba长度会减少。如果据我所知删除了某些内容,Tom答案中也可能有重复的ID。

–腰包
20年4月6日在17:14

#5 楼

这是其他答案的衍生形式,但对将来的用户可能有用。仅在尚未指定值的情况下进行编辑。

您应按照在编辑时的其他答案中所述设置触发器。

#6 楼

对于“是否有可能在Google表单中为其插入电子表格的每一行以及时间戳赋予唯一值?”同时还允许在添加进一步的响应之前在表单响应表中删除一行而不重复值,这应该可以:

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")


评论


我花了很长时间才独立找出与6年前完全相同的方法。写了一个新的解释方法的答案,但只想说:很棒的解决方案!

– David Mulder
20-4-27上午9:34

#7 楼

尽管pnuts早在2014年就已经描述了这种技术,但是某种程度上却没有引起人们的注意(我独立地弄清楚了,当我写这个答案时,我注意到他的答案是投票得最低的答案)。因此,让我来解释一下该技术:

当Google Forms填写电子表格时,它会清空所填写的行,但其他所有行保持不变。这意味着可以将某些内容放在第一行而不会被删除。

另外,某些函数(返回数组的函数)能够返回多个单元格。例如,如果您在一个空白单元格中输入以下内容,您会看到此信息:

={{1,1};{1,1}}


因此,我们可以创建一个无需填写即可填写ID的函数已删除。基本想法是:

=arrayformula(
  if(
    row(A1:A) = 1,
    "ID",
    if(
      not(isblank(A1:A)),
      "ID GENERATING CODE",
      ""
    )
  )
)


"ID GENERATING CODE"替换row(A1:A)-1的最简单代码是,但是如果您删除一行,这会中断(对于我而言这不是问题,但可能会成为您的问题)。如果存在问题,建议您添加一个自定义哈希函数,并将id填充为hash(timestamp & name)或类似的内容。