Apps Script Execution API 404 error with devMode: true

给你一囗甜甜゛ 提交于 2021-02-10 15:42:17

问题


When requesting POST https://script.googleapis.com/v1/scripts/{script_id}:run with devMode: true I get a 404 error. I can run the script successfully with devMode: false.

Although other people (1, 2) have raised this issue, none of the other solutions work. I keep getting an HTTP 404 Not Found error whenever my request comes with devMode: true.

I have performed the following steps:

  • created a new Google account
  • created a Cloud project
  • set up an OAuth consent screen for the project
  • authorized the domain for the app (just in case)
  • created 'Desktop' OAuth2 credentials for this project with OAuth scopes listed below
  • enables Apps Script API on the project
  • created a standalone Apps Script using Google Drive ("Test 1")
  • set the Cloud Platform project ID for the script Test 1
  • deploy the script Test 1 as an API executable, with access to "Anyone"
  • obtain a valid access token with the exact same scopes listed below and used for the OAuth consent screen configuration in the Cloud project. The token is for the same account that owns the script and the cloud project.

After performing the above steps, running with devMode: false was successful, but when switching to devMode: true it failed.

The same happens when I set access to "Only Me".

To make clear the steps that I took, I provide a full flow of screenshots taken along the way (open image in new window to zoom in; the flows to top-to-bottom; the three columns from left to right are: Cloud console project flow; Apps Script flow; OAuth2 flow):

At the request of @ziganotschka I made a simpler copy of my Apps Script function:

function test() {
  return 1;
}

And the appsscript.json manifest is:

{
  "timeZone": "Asia/Jerusalem",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

The code for obtaining the OAuth2 token and running the script, in Python:

##
# %%
import requests
import urllib
import json

client_id = '...'
client_secret = '...'

script_id = '...'

is_dev_mode = True  # True or False

##
# %% Initiate OAuth2
url = 'https://accounts.google.com/o/oauth2/auth?' + urllib.parse.urlencode({
    'client_id': client_id,
    'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob',
    'response_type': 'code',
    'scope': ' '.join([
        'https://www.googleapis.com/auth/userinfo.email',
        'https://www.googleapis.com/auth/userinfo.profile',
        'openid',
        'https://www.googleapis.com/auth/documents',
        'https://www.googleapis.com/auth/drive',
        'https://www.googleapis.com/auth/drive.scripts',
        'https://www.googleapis.com/auth/script.external_request',
        'https://www.googleapis.com/auth/script.projects',
        'https://www.googleapis.com/auth/script.scriptapp',
        'https://www.googleapis.com/auth/script.container.ui'
    ])
}, doseq=True)
print(url)

##
# %% Exchange authorization code with access and refresh tokens
print('Enter authorization token: ', end='')
authorization_code = input()

authorization_token_response = requests.post('https://accounts.google.com/o/oauth2/token', data={
    'code': authorization_code,
    'client_id': client_id,
    'client_secret': client_secret,
    'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob',
    'grant_type': 'authorization_code'
})
authorization_token_response.raise_for_status()

authorization_data = authorization_token_response.json()
access_token = authorization_data["access_token"]
refresh_token = authorization_data["refresh_token"]


##
# %% 
response = requests.post(f'https://script.googleapis.com/v1/scripts/{script_id}:run',
  data=json.dumps({
    "function": "test",
    "parameters": [],
    "devMode": is_dev_mode
  }),
  headers={
      'content-type': 'application/json',
      'authorization': f'Bearer {access_token}'
      }
)

response.raise_for_status()

print(response.content)

I get similar results for a curl call:

$ curl 'https://script.googleapis.com/v1/scripts/x...x:run' -X POST -H 'content-type: application/json' -d '{"function":"test","parameters":[],"devMode":true}' -H 'authorization: Bearer x...x' --silent
{
  "error": {
    "code": 404,
    "message": "Requested entity was not found.",
    "status": "NOT_FOUND"
  }
}

I consider this as an issue report, as Google mention that they use Stack Overflow to field technical questions for Apps Script API. As well as a beacon to anyone who has been frustrated with this issue.

Any my question would be -- am doing anything wrong?

As an aside question: what's the difference between substituting script_id for the Current API ID (as suggested in 'How to Execute a function guide'; this identifier seems to be identical to the script Project key under File > Project properties) and the Script's Drive file ID (suggested everywhere else; this seems to be identical to Script ID)?

来源:https://stackoverflow.com/questions/63393159/apps-script-execution-api-404-error-with-devmode-true

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!