获取 Google Apps 脚本中最后插入行的标识
Posted
技术标签:
【中文标题】获取 Google Apps 脚本中最后插入行的标识【英文标题】:Get identity of last inserted row in Google Apps Script 【发布时间】:2017-02-14 10:58:20 【问题描述】:平台:使用 JDBC 服务连接到 SQL Server 的 Google Apps 脚本。
如何获取插入行的标识 (id)? (下面提供的代码)我相信解决方案在这里:https://***.com/a/42655/3520117 但我正在努力使用 JDBC 服务在 Google Apps Script 中实现该通用解决方案。
代码.gs:
function postNewItem(formObject)
var useremail = Session.getActiveUser().getEmail();
var timeZone = CalendarApp.getDefaultCalendar().getTimeZone();
var timestamp = Utilities.formatDate(new Date(), timeZone, "yyyyMMdd HH:mm:ss"); // get current date/time
var conn = Jdbc.getConnection(connParams);
var stmt = conn.prepareStatement('INSERT INTO tblOne '
+ '(email, timestamp, var1, var2, var3) '
+ 'values (?, ?, ?, ?, ?)');
stmt.setString(1, useremail);
stmt.setString(2, timestamp);
stmt.setString(3, formObject.var1);
stmt.setString(4, formObject.var2);
stmt.setString(5, formObject.var3);
stmt.execute();
conn.commit();
conn.close();
// log event
logEvent(id, "N/A", "New item added.", useremail);
【问题讨论】:
How to get the insert ID in JDBC?的可能重复 马克,这是一个类似但不同的问题,因为这取决于 Google 对他们与 Google Apps 脚本一起使用的 JDBC 驱动程序的实现。他们的文档没有提及此功能,而且您链接到的示例代码是 Java,而 Google Apps 脚本在服务器端使用 javascript。 我确信 Google Apps Script 的 JDBC 实现支持这一点。执行(sql,autoGeneratedKeys)developers.google.com/apps-script/reference/jdbc/…getGeneratedKeys()developers.google.com/apps-script/reference/jdbc/…帮助! 根据谷歌的文档,它包装了一个普通的 JDBC 驱动程序,所以它应该可以工作。你真的试过了吗?如果您尝试过,请使用使用的代码和您遇到的任何错误更新您的问题。顺便说一句:您标记了“sql-server”,您确定 Google Apps 脚本使用的是 Microsoft SQL Server(如果是的话,我会很惊讶)。 惊讶马克 - 它是:“在 Apps 脚本中,JDBC 服务支持 Google Cloud SQL、mysql、Microsoft SQL Server 和 Oracle 数据库。”另外,我已经解决了我的问题并在下面发布了答案。感谢您的帮助。 【参考方案1】:解决了。我在此处发布此内容是为了让其他为此苦苦挣扎的人受益。
步骤:
添加 autoGeneratedKeys 标志
var stmt = conn.prepareStatement(query, 1);
获取自动生成的密钥列表
var results = stmt.getGeneratedKeys();
获取 ID:
while (results.next())
var id = results.getInt(1);
完整示例:
代码.gs:
function postNewItem(formObject)
var useremail = Session.getActiveUser().getEmail();
var timeZone = CalendarApp.getDefaultCalendar().getTimeZone();
var timestamp = Utilities.formatDate(new Date(), timeZone, "yyyyMMdd HH:mm:ss"); // get current date/time
var conn = Jdbc.getConnection(connParams);
var stmt = conn.prepareStatement('INSERT INTO tblOne '
+ '(email, timestamp, var1, var2, var3) '
+ 'values (?, ?, ?, ?, ?)', 1); // added autoGeneratedKeys flag
stmt.setString(1, useremail);
stmt.setString(2, timestamp);
stmt.setString(3, formObject.var1);
stmt.setString(4, formObject.var2);
stmt.setString(5, formObject.var3);
stmt.execute();
// start of additional code
var results = stmt.getGeneratedKeys();
while (results.next())
var id = results.getInt(1);
Logger.log(id);
// end of additional code
conn.commit();
conn.close();
// log event
logEvent(id, "N/A", "New item added.", useremail);
【讨论】:
在普通 JDBC 中,可能的值为Statement.RETURN_GENERATED_KEYS
(= 1
) 和 Statement.NO_GENERATED_KEYS
(= 2
)。以上是关于获取 Google Apps 脚本中最后插入行的标识的主要内容,如果未能解决你的问题,请参考以下文章
使用 Google BigQuery / Apps 脚本为插入 Google 表格的数据添加时间戳
使用 Google Apps 脚本将 Null 值从表格插入 Mysql 数据库
如何使用 Google Apps 脚本将来自 Google 电子表格和 ScriptDB 的数据插入 BigQuery 表