如何在Google Sheet中生成uuid?

问题描述 投票:0回答:7

如何在Google表格中生成uuid(例如ccb8a660-91c9-a556-58e0-4fa7-229516872004)。

用宏吗?还是公式?

google-apps-script google-sheets uuid google-sheets-custom-function
7个回答
100
投票

生成UUID

您可以使用

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

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

脚本:

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

参考:

生成静态UUID

使用自定义函数时,Spreadsheet 会自动重新计算该值。此示例将修复 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事件触发。
  • 这是一个简单的示例脚本。所以请根据您的情况修改此内容。

参考:


25
投票

thinkyfish 公式根据 broofa 在 How do I create a 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),MID("0123456789abcdef",RANDBETWEEN(1,16),1))

UUID 版本 4 合规性。


5
投票

创建的uuid随着时间的推移而改变。

我认为如果不使用 Apps 脚本就无法解决这个问题。
例如:

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());
  }
}

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))


1
投票

感谢您提供有关此线程的所有详细信息。我最终做的是创建一个宏,该宏将填充一个范围内的所有选定单元格,每个单元格都有自己的 UUID。我使用这种方法在选定的单元格中设置值,而不用担心“覆盖”它们。我可以使用 Protect Range 来避免单元格被无意更新。

此脚本有 2 个检查:

  1. 所选范围必须仅覆盖单个列
  2. 所有选定的单元格必须为空白(即选定的单元格不能有值)

如果满足上述 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
公式定义:
=较低(DEC2HEX(RANDBETWEEN(0, 15)))

函数名称:RANDOM_HEX_BY_LENGTH
参数占位符 [可选]:长度
公式定义:
=JOIN("", MAKEARRAY(1, 长度, LAMBDA(行索引, 列索引, 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(行索引, 列索引, 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(行索引, 列索引, LOWER(DEC2HEX(RANDBETWEEN(0, 15)))))))

我推荐命名函数!


-1
投票

如果您只想要一个可以快速插入的公式,请尝试此操作。这里需要注意的是,生成的值中不会有任何字母字符,但无论如何,这些字符对于几乎任何目的都应该“足够好”。

=RANDBETWEEN(10000000,99999999) & "-" & RANDBETWEEN(1000,9999) & "-" & RANDBETWEEN(1000,9999) & "-" & RANDBETWEEN(1000,9999)& "-" & RANDBETWEEN(1000,9999) & RANDBETWEEN(10000000,99999999)
© www.soinside.com 2019 - 2024. All rights reserved.