Передача данных в Google Apps Script с Python. Что не так? - PullRequest
1 голос
/ 17 января 2020

Вот моя 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 Script:

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

Я пытался выяснить, что я делаю неправильно и почему объект возвращается неопределенным, когда я пытаюсь проиндексировать его, даже когда регистратор может прочитать значения. Кажется, что-то связано с использованием чисел в качестве ключей объекта, что неправильно обрабатывается. Сначала я был уверен, что делаю что-то глупое, но в этом тестовом примере я сузил это до.

1 Ответ

2 голосов
/ 17 января 2020
  • Вы уже смогли запустить функцию скрипта Google Apps с помощью API скриптов Apps с Python.
  • Когда вы запускаете функцию test1 на стороне GAS с аргументами {"1": "hi", "3": "bye","a5": "yes"}, event[1] и event["3"] return undefined.
    • Вы хотите получить значения hi и bye с event[1] и event["3"] соответственно.

Если мое понимание верно как насчет этого ответа? Думайте об этом как об одном из нескольких возможных ответов.

Проблема и обходное решение:

Когда следующая функция запускается непосредственно в редакторе сценариев Google Apps Script, все значения hi bye и 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 объект) можно использовать для 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 не является причиной этой проблемы.

Ситуация сверху, я думал, что когда объект отправляется на сторону ГАЗ, объект не может быть правильно принят. В качестве обходного пути я поставил 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
}

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, в котором вы хотите, я приношу свои извинения.

...