【发布时间】:2015-11-18 18:34:25
【问题描述】:
我是 Google 表单和 Google Apps 脚本的新手。我有十个 Google 表单,在提交表单时,它们会填充相应的 Google 表格。
现在,这就是我想要的,在提交表单时,我希望该信息也存储在云 SQL 数据库中。哪些步骤将实现这一目标?
【问题讨论】:
标签: google-apps-script google-sheets google-cloud-sql google-forms
我是 Google 表单和 Google Apps 脚本的新手。我有十个 Google 表单,在提交表单时,它们会填充相应的 Google 表格。
现在,这就是我想要的,在提交表单时,我希望该信息也存储在云 SQL 数据库中。哪些步骤将实现这一目标?
【问题讨论】:
标签: google-apps-script google-sheets google-cloud-sql google-forms
接受响应并将其复制到电子表格的 Google 表单的正常数据流如下所示:
表单提交触发器有两次机会在 Cloud SQL 数据库中复制表单响应;您可以从Google Form Form submit event 或Google Sheets Form submit event 触发。
无论哪种方式,您都将拥有一个在每次提交表单时都会调用的脚本,以及一个包含响应值的事件对象。您的触发器函数应使用JDBC 连接到数据库 - 该链接包含一个介绍,引导您了解重点。
假设我们有一个表格询问两个问题,“姓名”和“年龄”。这将导致我们的电子表格中有 3 列;每个问题的“时间戳”加一个。
为此,我们设置了一个 Cloud SQL 数据库,其中包含相同的三列。
写入 Cloud SQL 数据库的 Google 表格 表单提交 触发器函数看起来像以下未经测试代码:
// Replace the variables in this block with real values.
var address = 'database_IP_address';
var user = 'user_name';
var userPwd = 'user_password';
var db = 'database_name';
var dbUrl = 'jdbc:mysql://' + address + '/' + db;
// Receive form response and replicate to a row in SQL table
function handleFormSubmit( event ) {
var conn = Jdbc.getConnection(dbUrl, user, userPwd);
var stmt = conn.prepareStatement('INSERT INTO entries '
+ '(Timestamp, Name, Age) values (?, ?, ?)');
stmt.setString(1, event.namedValues['Timestamp']);
stmt.setString(2, event.namedValues['Name']);
stmt.setString(3, event.namedValues['Age']);
stmt.execute();
}
【讨论】:
event 指的是什么?曾尝试过完全相同的事情,但是当我检查 event 未定义时...也收到此错误 TypeError: Cannot read property "namedValues" from undefined.
event 对象自动传递给从脚本触发器调用的函数。在这种情况下,设置一个触发器,从 on form submit 事件调用提供的函数。
举一个我正在工作的解决方案的例子。我修改了 Mogsdad 的脚本以使用最新的参数和连接功能,并修复了语法错误。
//Event is automatially passed on form submission when executed as a trigger.
//It contains objects that the user submitted
function writeToCloudSQL(event) {
//Note we get subname from the 'Instance Connection Name' of the Overview tab in the CloudSQL portal
var subname = 'see image';
var user = 'user';
var userPwd = 'pwd';
var db = 'db_name';
var dbUrl = 'jdbc:google:mysql://' + subname + '/' + db;
var conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);
var stmt = conn.prepareStatement('INSERT INTO tbl_users (Timestamp, DL_ID, DOB, Last4SSN, HTMLGathered) values (NOW(), ?, ?, ?, \'No\');');
stmt.setString(1, event.namedValues['DL_ID']);
stmt.setString(2, event.namedValues['DOB']);
stmt.setString(3, event.namedValues['Last4SSN']);
stmt.execute();
}
定位子名称: Locating the subname
在此处阅读有关 Event 参数的更多信息:
https://developers.google.com/apps-script/guides/triggers/events
在此处阅读有关连接字符串的更多信息:
还要确保您已允许对 google 脚本进行网络访问
https://developers.google.com/apps-script/guides/jdbc?hl=en#using_jdbcgetconnectionurl
【讨论】:
Zapier 及其 SQL Server 和 Google Sheets 集成可以做到这一点。我不隶属。 https://zapier.com/apps/sql-server/integrations
【讨论】:
如果您不想推出自己的解决方案,SeekWell 可让您自动将数据从 SQL 发送到表格,还可以将表格中的更改同步回数据库。 Apps Script 可以做到这一点,但我发现它有问题并且对我们的用例有限制,所以我构建了其他东西。有免费和付费计划。
免责声明:这是我建造的。
【讨论】: