自动递增 ID 号 Google Apps 脚本

2024-05-18

我想在向工作表添加新值时自动增加 ID。我尝试从当前的 ID 列表创建一个列表,但它只计数到 5,因此当自动递增时,它只会到达一个点并为每个输入保存该数字。

以下是我尝试获取 ID 号列表的方法,但它没有获取整个列表。我缺少什么?

var ss = SpreadsheetApp.getActiveSpreadsheet();
var row = ss.getSheetByName("DataBase1").getRange(3,1,ss.getLastRow(),1).getValues();

.getValue() 获取最后一个值,并使用 .alert() 在按钮单击后显示在屏幕上

var row = ss.getSheetByName("DataBase1").getRange(3,1,ss.getLastRow(),1).getValue();
SpreadsheetApp.getUi().alert(row);

这只能得到 5 个值,比如 0,1,2,3,4 ... 就卡住了。

我手动从 1 添加到 10,看看它是否自动递增到 11,并且重复数到 6。

我究竟做错了什么?


因此,您希望每一行都有一个唯一的 ID。根据您的要求,您有多种选择。

方法一:简单的公式

如果您不更改顺序或删除(不仅仅是清空)行,则可以简单地使用列数作为设置 ID 的值。只需添加公式即可=ROW()为其赋值。

方式2:使用UUID

如果您不关心它的值是什么,您可以使用 UUID。这将使其不依赖于其他行的值。您可以使用以下方式获得一个:

  const uuid = Utilities.getUuid()

这是最通用的选择。

方式三:使用属性保存当前值

如果您需要它们是仅在使用脚本时设置的自动递增数字(即不手动添加 id),您可以使用属性来保留计数:

function getNextId() {
  // Get properties
  const properties = PropertiesService.getScriptProperties()

  // Aquire the script lock. Prevents race condition
  const lock = LockService.getScriptLock()
  lock.waitLock(2000)

  // Get the saved ID and save the next value
  // Properties are string so it has to convert the type
  const id = parseInt(properties.getProperty('id_seq') || 0)
  properties.setProperty('id_seq', (id+1).toString())

  // Release the script lock (allows other executions to continue)
  lock.releaseLock()

  // Return the result
  console.log(id)
  return id
}

要使用它,您可以像使用 UUID 一样调用它:

  const id = nextID()

请注意,算法需要锁定以防止竞争条件(如果脚本同时在多个实例中执行)。

这类似于数据库上的序列。

方式4:最大+1

这将添加一个仅包含 ID 的新行。需要在添加数据之前使用。如果最大的数字被删除,相同的ID将被重新使用。请注意,我们还需要锁定整个操作,并且还需要刷新以 100% 确定另一个脚本会看到此脚本所做的更改。

function setNextId() {
  // Get spreadsheet
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]

  // Aquire the script lock. Prevents race condition
  const lock = LockService.getScriptLock()
  lock.waitLock(2000)

  // Get value from last row
  const lastCell = sheet.getRange(1, 1, sheet.getLastRow(), 1)
  const values = lastCell.getValues()
    .flat()
    .filter(Number.isInteger)
  const value = Math.max(...values)
  
  // Create new row
  const newCell = sheet.getRange(sheet.getLastRow()+1, 1)
  newCell.setValue(value+1)

  // Ensure value is added before releasing the lock
  SpreadsheetApp.flush()

  // Release the script lock (allows other executions to continue)
  lock.releaseLock()
}

方式5:最后一行+1

与最后一个类似,但它看起来只是最后一行。这不支持对行重新排序。

function setNextId() {
  // Get spreadsheet
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0]

  // Aquire the script lock. Prevents race condition
  const lock = LockService.getScriptLock()
  lock.waitLock(2000)

  // Get value from last row
  const lastCell = sheet.getRange(sheet.getLastRow(), 1)
  const value = lastCell.getValue()

  // Create new row
  const newCell = lastCell.offset(1, 0)
  newCell.setValue(value+1)

  // Ensure value is added before releasing the lock
  SpreadsheetApp.flush()

  // Release the script lock (allows other executions to continue)
  lock.releaseLock()
}

参考

  • Utilities.getUuid()(Google Apps 脚本参考) https://developers.google.com/apps-script/reference/utilities/utilities#getuuid
  • 锁定服务(Google Apps 脚本参考) https://developers.google.com/apps-script/reference/lock
  • 属性服务(Google Apps 脚本参考) https://developers.google.com/apps-script/reference/properties/properties-service
  • SpreadsheetApp.flush()(Google Apps 脚本参考) https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#flush
  • 类范围(Google Apps 脚本参考) https://developers.google.com/apps-script/reference/spreadsheet/range
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动递增 ID 号 Google Apps 脚本 的相关文章

随机推荐

  • SSL 证书可以用于对文件进行数字签名吗?

    我想问一些关于数字签名的问题 我不太确定 我不想创建用于签署某些 PDF 文件的自签名证书 而是想获取已验证数据的 SSL 证书 但问题是 SSL 证书可以用于数字签名文件吗 或者它是否以某种方式不兼容 编辑 澄清一下 这个问题不是关于如何
  • C# 索引范围表达式的错误结果

    我对索引范围运算符有点困惑 我期望表达式myString 0 应该等于myString 0 0 then myString Substring 0 1 or myString 0 ToString 如果是下面的代码 string myStr
  • 当应用程序位于前台时,Angular 8 firebase 推送通知不起作用

    我正在按照此文档在我的 Angular Web 应用程序上实现 FCM 当我发送通知时 当应用程序未处于活动状态时 它会成功接收 接收后台通知 但如果应用程序处于活动状态 我就不会收到通知 请按照下列步骤操作 https dev to ma
  • 像 WhatsApp 一样发送图片

    我做了一个聊天应用程序 我想添加照片 文件共享我的应用程序中的概念与 WhatsApp 相同 我已经使用该应用程序制作了Xmpp Openfire目前我正在使用此功能进行照片共享 但它并不完全可靠 public void sendFile
  • 此页面上的脚本导致 ie 运行缓慢

    问题就在标题中 IE 行为异常 并说有一个脚本运行缓慢 FF 和 Chrome 没有这个问题 我怎样才能找到问题所在 那个页面有很多JS 手动检查不是一个好主意 EDIT 这是我正在处理的一个项目的页面 但我需要一个工具来查找问题 End
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • 检测 Google 验证码的挑战窗口何时关闭

    我正在使用谷歌隐形验证码 有没有办法检测挑战窗口何时关闭 我所说的挑战窗口是指您必须选择一些图像进行验证的窗口 目前 我在按钮上放置了一个旋转器 一旦单击按钮 就会呈现验证码挑战 无法向用户提示另一个质询窗口 我以编程方式调用渲染函数 gr
  • R中的重叠矩阵

    我有以下数据框 id channel 1 a 1 b 1 c 2 a 2 c 3 a 我想创建并重叠矩阵 它基本上是一个方阵 行和列标签为 a b c 表中的每个条目显示每个通道共有多少个 id 例如 在上面的例子中 矩阵看起来像 a b
  • Golang:带有 JSON 负载的 http.NewRequest POST 返回错误 500

    我正在开发一个 API 库 有一个API端点 POST 当您发出curl命令时 它是 curl H X API TOKEN API TOKEN http interest graph getprismatic com text topic
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • java.lang.LinkageError:尝试重复的类定义

    为什么会发生错误以及如何修复它 02 13 02 pool 4 thread 2 WARN Exception in thread pool 4 thread 2 02 13 02 pool 4 thread 2 WARN java lan
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • Ruby on Rails 服务器在 HTTPS POST 请求期间崩溃

    我正在尝试与你沟通城市飞艇API http urbanairship com docs push html broadcast使用 ROR Web 应用程序 在我的控制器中 我有以下代码 require net http require n
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • Excel工作簿关闭后反复打开

    我使用了 Application ontime 方法来调度一些宏 关闭工作簿后 它会一次又一次地打开 为了解决这个问题 我在工作簿上设置了另一个事件 BeforeClosed 现在它显示运行时错误 1004 Object Applicati
  • 检查 TypeScript 中是否选中复选框元素

    我的 html 文件上有一个复选框
  • ReactiveUI 和 Caliburn Micro 一起?

    我一直在使用 Caliburn Micro 作为我们的 MVVM 框架对新的 Silverlight 应用程序进行一些原型工作 团队总体上对此感到满意 为了解决对服务的请求限制的一些问题 有人建议我研究 ReactiveUI 的 React
  • 正则表达式获取字符串中的第一个数字和其他字符

    我是正则表达式的新手 想知道如何才能只获取字符串中的第一个数字 例如100 2011 10 20 14 28 55 在这种情况下 我希望它返回100 但该数字也可以更短或更长 我在想类似的事情 0 9 但它单独获取每个数字 100 2001
  • 自动递增 ID 号 Google Apps 脚本

    我想在向工作表添加新值时自动增加 ID 我尝试从当前的 ID 列表创建一个列表 但它只计数到 5 因此当自动递增时 它只会到达一个点并为每个输入保存该数字 以下是我尝试获取 ID 号列表的方法 但它没有获取整个列表 我缺少什么 var ss