获取 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 表

Google表格使用Apps脚本插入散点图+趋势线

Apps 脚本 - 在 Google 表格上复制“将图像放入选定的单元格”

使用 Apps 脚本在带有日期的 Google 电子表格中存档