У меня была та же ошибка, что и у вас:
К сожалению, произошла ошибка сервера. Пожалуйста, подождите немного и попробуйте снова.
Затем я использовал делегирование по всему домену , что позволяет служебной учетной записи выдавать себя за любого пользователя в вашем G Suite домен . Вы должны иметь учетную запись G Suite, чтобы иметь возможность использовать широкое делегирование домена, как говорят документы:
Если у вас есть домен G Suite - например, если вы используете G Suite - администратор домена G Suite может авторизовать приложение для доступа к пользовательским данным от имени пользователей в домене G Suite.
Итак, зачем вам выдавать себя за пользователя (реального человека)? это связано с тем, что служебная учетная запись - это бот (а не реальный человек), который используется для взаимодействия между серверами, что делает возможным, чтобы ваше приложение вызывало API Google, и хотя учетная запись службы имеет параметр client_email
, который имеет структура, подобная name@project-randomnumber.iam.gserviceaccount.com
, это не реальная электронная почта, которая принадлежит реальному человеку (я знаю, что это немного сбивает с толку).
Если вы отметите Развертывание скрипта как веб-приложения в 4-м Состояния шага:
В разделе «Выполнить приложение как» выберите, с чьей авторизацией должно запускаться приложение: ваша учетная запись (разработчик) или учетная запись пользователя, который посещает приложение (см. разрешения).
Поэтому вы не можете использовать URL-адрес, предоставленный «Развернуть как веб-приложение». Чтобы реализовать делегирование на уровне домена в вашем коде, вы можете сделать это следующим образом:
from __future__ import print_function
from google.oauth2 import service_account
from google.auth.transport.urllib3 import AuthorizedHttp
SCOPES = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = 'service_account.json'
# The user we want to "impersonate"
USER_EMAIL = "name@domain"
def main():
try:
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
delegated_credentials = credentials.with_subject(USER_EMAIL)
authed_http = AuthorizedHttp(delegated_credentials)
response = authed_http.request('GET', "https://script.google.com/macros/s/<your-id>/exec")
print(response._body)
except BaseException as err_base2:
print(err_base2)
if __name__ == '__main__':
main()