2

这是我的 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

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

4

1 回答 1

3
  • 您已经能够使用带有 Python 的 Apps Script API 运行 Google Apps Script 的功能。
  • 当您使用, both和returntest1的参数在 GAS 端运行函数时。 {"1": "hi", "3": "bye","a5": "yes"}event[1]event["3"]undefined
    • 您想分别检索值hibye和。event[1]event["3"]

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

问题和解决方法:

在 Google Apps Script 的脚本编辑器中直接运行以下函数时hibye和的所有值都会yes显示在日志中。由此可知,Google Apps Script 可以使用数字这个键。

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 发送时,作为数字的键不返回值。我也可以在我的环境中确认这种情况。在这种情况下,可以检索每个密钥。但是当键是数字时,无法检索键的值。另一方面,在官方文档中,我可以确认struct_value(JSON object) 可以用于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
}

参考:

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

于 2020-01-17T02:18:09.690 回答