google-apps-script - 将数据从 Python 传递到 Google Apps 脚本。怎么了?

标签 google-apps-script google-api-python-client google-apps-script-api

这是我的 Python 端。

...
SCRIPT_ID = '<script id>'
creds = GetGoogleCredentials()
gscripts = build( 'script', 'v1', credentials = creds )

# Create an execution request object.
request = {
   "function": "test1", 
   "devMode": True, 
   "parameters": [{
      "1": "hi", 
      "3": "bye",
      "a5": "yes"
   }]
}

# Make the API request.
response = gscripts.scripts().run(
   body = request,
   scriptId = SCRIPT_ID
).execute()

print( response )

这是 Apps 脚本方面:

function test1( event ) {
   Logger.log( event );
   Logger.log( event[1] );
   Logger.log( event["3"] );
   Logger.log( event["a5"] );
}

记录器中的输出:

[20-01-16 16:34:21:530 PST] {1=hi, 3=bye, a5=yes}
[20-01-16 16:34:21:531 PST] undefined
[20-01-16 16:34:21:531 PST] undefined
[20-01-16 16:34:21:532 PST] yes

我一直在试图找出我做错了什么以及为什么当我尝试索引它时对象返回未定义,即使记录器能够读取值。这似乎与使用数字作为未正确处理的对象键有关。一开始我确信我在做一些愚蠢的事情,但这是我缩小范围的测试用例。

最佳答案

  • 您已经能够使用 Apps Script API 和 Python 来运行 Google Apps 脚本的功能。
  • 当您运行 test1 的函数时在 GAS 端,参数为 {"1": "hi", "3": "bye","a5": "yes"} ,两者 event[1]event["3"]返回undefined
    • 您想要检索值 hibyeevent[1]event["3"] ,分别。

如果我的理解是正确的,这个答案怎么样?请将此视为几个可能答案之一。

问题和解决方法:

当以下函数直接在 Google Apps 脚本的脚本编辑器中运行时, hi 的所有值, byeyes都显示在日志中。由此可见,Google Apps Script 可以使用的 key 就是数字。

function myFunction() {
  var event = {"1": "hi", "3": "bye","a5": "yes"};
  Logger.log( event[1] );  // <--- hi
  Logger.log( event["3"] );  // <--- bye
  Logger.log( event["a5"] );  // <--- yes
}

何时 {"1": "hi", "3": "bye","a5": "yes"}使用 Apps Script API 发送,作为数字的键不返回值。我也可以在我的环境中确认这种情况。在这种情况下,可以检索每个 key 。但是当键是数字时,无法检索键的值。另一方面,在the official document ,我可以确认struct_value (JSON 对象)可用于 parameters[] .

作为另一项测试,我运行了函数 test1使用以下curl命令。

curl -X POST \
  -H "Authorization: Bearer ###" \
  -H "Content-Type: application/json" \
  -d "{function: 'test1', parameters: [{'1': 'hi', '3': 'bye', 'a5': 'yes'}], devMode: true}" \
  "https://script.googleapis.com/v1/scripts/###:run"

我可以确认发生了同样的问题。由此看来,google-api-python-client模块不是造成此问题的原因。

从上面的情况来看,我认为当对象发送到GAS端时,对象可能无法被正确接收。因此,作为解决方法,我输入 event = JSON.parse(JSON.stringify(event))在函数的顶部。通过此,我可以确认所有值均已检索。

修改后的脚本:

function test1( event ) {
   event = JSON.parse(JSON.stringify(event));  // Added

   Logger.log( event );  // <--- {1=hi, 3=bye, a5=yes}
   Logger.log( event[1] );  // <--- hi
   Logger.log( event["3"] );  // <--- bye
   Logger.log( event["a5"] );  // <--- yes
}

引用文献:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

关于google-apps-script - 将数据从 Python 传递到 Google Apps 脚本。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59779811/

相关文章:

google-apps-script - 由内置电子表格函数组成的 Google 电子表格自定义函数

python - 使用 Google 的 Python 客户端库删除日历事件

python - Google API Python 客户端 OAUTH Appengine 示例很无聊?

google-apps-script - 如何从 Google OAuth 2.0 Playground 运行 Google App Script 功能 |调用者没有权限

python - Google App Script API 无法验证 "Request contains an invalid argument"

google-apps-script - 使用 Google Script Editor 将 PDF 转换为 Doc

javascript - 使用谷歌脚本达到一定数量时显示值

javascript - 有没有办法通过 Javascript 从 HTML 生成 Google 文档?

python - 为什么 Google API V3 不返回 child ?

google-apps-script - GCP App Script API Auth 仅对两个用户不起作用(代码 : 403, "PERMISSION_DENIED")