如何在Google表格中生成UUID?

46
如何在Google表格中生成UUID(例如:ccb8a660-91c9-a556-58e0-4fa7-229516872004)?可以使用宏或公式。
8个回答

101

生成 UUID

您可以使用 Utilities.getUuid() 生成 UUID。但是,由于 Google Sheet 的函数集中没有相应的函数,因此需要使用自定义函数来生成 UUID。为了生成 UUID,请执行以下操作:

  1. 打开 Google Apps Script 编辑器。
  2. 复制并粘贴以下脚本并保存。
  3. =uuid() 放入工作表中的单元格中。

脚本:

function uuid() {
  return Utilities.getUuid();
}

参考:

生成静态UUID

当使用自定义函数时,值会因电子表格的自动重新计算而发生变化。此示例将修复UUID。

示例脚本:

function onEdit(e) {
  if (e.range.getFormula().toUpperCase()  == "=UUID(TRUE)") {
    e.range.setValue(Utilities.getUuid());
  }
}

function uuid() {
  return Utilities.getUuid();
}
  • 使用此脚本时,请按照以下步骤操作:
    1. 将脚本复制并粘贴到电子表格的绑定脚本中,并保存。
    2. 在工作表中的单元格中输入 =uuid()
      • 在这种情况下,=uuid() 被放置为自定义函数。因此,当电子表格自动计算时,该值会发生变化。
    3. 在工作表中的单元格中输入 =uuid(true)
      • 在这种情况下,=uuid()onEdit() 放置为值。因此,即使电子表格自动计算,该值也不会改变。

注意:

  • 在这种情况下,只有手动放置函数时才能使用 =uuid(true),因为它使用了 OnEdit 事件触发器。
  • 这是一个简单的示例脚本。因此,请根据您的情况进行修改。

参考资料:


2
@I'-'I 感谢您的评论。当运行“Utilities.getUuid()”时,结果值始终不同。但是我没有关于创建的值是否随时间改变的信息。对于这种情况,我感到很抱歉。如果我找到了相关信息,我会及时向您报告。如果我误解了您的评论,请告诉我。 - Tanaike
2
@I'-'I 我也对随时间变化感兴趣。我想尝试调查一下。谢谢您提供这个有趣的主题。 - Tanaike
所提出的解决方案是否创建了UUID V4?这个标准在我的项目中非常关键。 - tivoni
根据java.util文档,这是一个uuid V2。这让我想到一个问题,是否可以通过GS Utilities接口生成V4? - tivoni
1
@tivoni 谢谢您的回复。关于您的新问题,我注意到它已经得到解决。我为此感到高兴。 - Tanaike
显示剩余3条评论

25

修正版的 thinkyfish 公式,基于 broofa 在 如何创建 GUID / UUID? 上的回答进行了修正。

=CONCATENATE(MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),"-",MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),"-4",MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),"-",MID("89ab",RANDBETWEEN(1,4),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),"-",MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1))

这段代码是用于生成一个随机的UUID串,采用的是Excel函数CONCATENATE以及MID。其中,0123456789abcdef是16进制数,-4表示一个固定的字符,89ab是一段固定的16进制数。

符合UUID版本4标准。


有没有办法防止每次更新表格时重新计算值?编辑:使用RANDBETWEEN似乎不可能,但是使用伪随机值可能是可能的 - ANimator120
Appsheet可以通过使用“初始值”来帮助解决这个问题。另外,还可以使用DEC2HEX(RANDBETWEEN(0, 16^8-1), 8)来实现。 - undefined

5
我尝试创建一个纯表格函数,只使用表格代码就可以创建完整的UUID。以下是我的实现方式,虽然看起来有点傻,但似乎确实有效。它会在每次表格更新时重新生成,所以可能没有什么用处,但我还是想发布它,因为目前还没有纯表格的实现方式。

=CONCATENATE(MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),"-",MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),"-",MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),"-",MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),"-",MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1),MID("0123456789abcdef",RANDBETWEEN(1,16),1))

这段代码使用Excel函数CONCATENATE将不同的随机选取的十六进制字符合并成一个字符串,其中用"-"分隔开每个字符块。

5

创建的 UUID 会随时间变化。

我认为这个问题如果不使用 Apps Script 是无法解决的。
例如:

var sheet = SpreadsheetApp.getActiveSheet();
var values = sheet.getRange('A1:A10').getValues();

for (var i = 0; i < values.length; i++) {
  // When a cell is empty, set a uuid to the cell.
  if (!values[i][0]) {
    sheet.getRange('A' + (1 + i)).setValue(Utilities.getUuid());
  }
}

2
感谢您在这个帖子中提供的所有细节。我最终创建了一个宏,可以为范围内的所有选定单元格填充自己的UUID。我使用此方法来设置所选单元格中的值,并不担心“覆盖”它们。我可以使用保护范围来避免意外更新单元格。
该脚本有两个检查:
  1. 选择的范围必须仅涵盖一列
  2. 所有选定单元格必须为空(即没有选定单元格可以具有值)
如果满足上述两个限制,则每个单元格都会填充一个值。以下是宏代码:
function fillSelectedWithUUIDs() {
  let curSheet = SpreadsheetApp.getActiveSheet();
  let curSelection = curSheet.getSelection();
  let curRange = curSelection.getActiveRange();

  let ui = SpreadsheetApp.getUi();

  if (curRange.getNumColumns() !== 1) {
    ui.alert(`Range must only contain one column.`);
    return;
  }

  for (let i = 0; i < curRange.getNumRows(); i++) {
    let curCell = curRange.getCell(1 + i, 1);
    if (curCell.getValue() !== "") {
      ui.alert(`ERROR: Cannot overwrite value in cell (${curCell.getA1Notation()})`);
      return;
    }
  }

  for (let i = 0; i < curRange.getNumRows(); i++) {
    curRange.getCell(1 + i, 1).setValue(Utilities.getUuid())
  }

  ui.alert(`Added ${curRange.getNumRows()} UUIDs`);
}

希望这对一些人有用!

0

定义命名函数

函数名称:RANDOM_HEX
公式定义:
=LOWER(DEC2HEX(RANDBETWEEN(0, 15)))

函数名称:RANDOM_HEX_BY_LENGTH
参数占位符 [可选]:length
公式定义:
=JOIN("", MAKEARRAY(1, length, LAMBDA(rowIndex, columnIndex, RANDOM_HEX())))

函数名称:UUID_V4
公式定义:
=JOIN("-", RANDOM_HEX_BY_LENGTH(8), RANDOM_HEX_BY_LENGTH(4), RANDOM_HEX_BY_LENGTH(4), RANDOM_HEX_BY_LENGTH(4), RANDOM_HEX_BY_LENGTH(12))

或者...

=JOIN("-", JOIN("", MAKEARRAY(1, 8, LAMBDA(rowIndex, columnIndex, LOWER(DEC2HEX(RANDBETWEEN(0, 15)))))), JOIN("", MAKEARRAY(1, 4, LAMBDA(rowIndex, columnIndex, LOWER(DEC2HEX(RANDBETWEEN(0, 15)))))), JOIN("", MAKEARRAY(1, 4, LAMBDA(rowIndex, columnIndex, LOWER(DEC2HEX(RANDBETWEEN(0, 15)))))), JOIN("", MAKEARRAY(1, 4, LAMBDA(rowIndex, columnIndex, LOWER(DEC2HEX(RANDBETWEEN(0, 15)))))), JOIN("", MAKEARRAY(1, 12, LAMBDA(rowIndex, columnIndex, LOWER(DEC2HEX(RANDBETWEEN(0, 15)))))))

我推荐使用命名函数!


RANDOM_HEX_BY_LENGTH(8) 可以简化为 DEC2HEX(RANDBETWEEN(0, 16^8-1), 8) - undefined
虽然可以承认,如果太高的话,这个方法就不适用了,这种情况下,你需要做2乘以6,而不是12。 - undefined
你的回答可以通过提供更多支持性的信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

0
看到很多过于复杂的解决方案。我们可以通过以下方式生成UUID4:
=lower(CONCATENATE(DEC2HEX(RANDBETWEEN(0, 16^8-1), 8),"-",DEC2HEX(RANDBETWEEN(0, 16^4-1), 4),"-",DEC2HEX(RANDBETWEEN(0, 16^4-1), 4),"-",DEC2HEX(RANDBETWEEN(0, 16^4-1), 4),"-",DEC2HEX(RANDBETWEEN(0, 16^6-1), 6)),DEC2HEX(RANDBETWEEN(0, 16^6-1), 6)))
如果你想要大写版本,可以去掉lower。
这是基于以下公式: https://support.google.com/appsheet/answer/10105828?hl=en 以下的电子表格公式适用于Microsoft Excel和Google Sheets,将生成与AppSheet的UNIQUEID()函数生成的唯一ID一致的值:
=DEC2HEX(RANDBETWEEN(0, 4294967295), 8)
要生成小写键,请使用以下公式:
=LOWER(DEC2HEX(RANDBETWEEN(0, 4294967295), 8)) 4294967295只是16^8-1的实际值。我们使用2x16^6而不是16^12,因为16^12超过了RANDBETWEEN允许的最大值。
虽然我可以想象:
function uuid() {
  return Utilities.getUuid();
}

如果你在写脚本的话,可能仍然是最好的答案,但如果你想避免使用脚本,上面的公式应该能完成任务。

-2

如果你只是想要一个可以快速使用的公式,请尝试这个。需要注意的是,生成的值中不会有任何字母字符,但是对于几乎任何目的来说,这些值都应该足够好用。

=RANDBETWEEN(10000000,99999999) & "-" & RANDBETWEEN(1000,9999) & "-" & RANDBETWEEN(1000,9999) & "-" & RANDBETWEEN(1000,9999)& "-" & RANDBETWEEN(1000,9999) & RANDBETWEEN(10000000,99999999)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接