Google apps script 哪些是在应用程序脚本API上运行请求的正确作用域

Google apps script 哪些是在应用程序脚本API上运行请求的正确作用域,google-apps-script,google-oauth,service-accounts,google-apps-script-api,Google Apps Script,Google Oauth,Service Accounts,Google Apps Script Api,我正在使用应用程序脚本API运行带有服务帐户凭据的函数。 我在Rest资源API中添加了所有必需的作用域 但是当我在下面运行这个脚本时,它失败了 function run(){ var CREDENTIALS = { "private_key": "Your Private key", "client_email": "Your Client email", "client_id"

我正在使用应用程序脚本API运行带有服务帐户凭据的函数。 我在Rest资源API中添加了所有必需的作用域

但是当我在下面运行这个脚本时,它失败了

function run(){

 var CREDENTIALS = {
  "private_key": "Your Private key",
  "client_email": "Your Client email",
  "client_id": "Your Client ID",
  "user_email": "Your Email address",
  "api_key": "Your API key"
 };
 var service = getService(CREDENTIALS.client_email,CREDENTIALS.private_key);
  service.reset();
  if (service.hasAccess()) {
    var url = 'https://script.googleapis.com/v1/projects/[SCRIPT ID]:run';
    var body = {
      "function": [FUNCTION NAME]
    };
    var params = {
      headers: {
        Authorization: 'Bearer ' + service.getAccessToken()
      },
      method: 'post',
      playload : JSON.stringify(body),
      contentType: 'application/json',
      muteHttpExceptions: true
    };
    var response = UrlFetchApp.fetch(url, params);
    Logger.log(response);
  }
  else {
    Logger.log(service.getLastError());
  }
}

function getService(email, privateKey) {
  return OAuth2.createService('Service Account')
      // Set the endpoint URL.
      .setTokenUrl('https://oauth2.googleapis.com/token')

      // Set the private key and issuer.
      .setPrivateKey(privateKey)
      .setIssuer(email)

      // Set the name of the user to impersonate. This will only work for
      // Google Apps for Work/EDU accounts whose admin has setup domain-wide
      // delegation:
      // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
      .setSubject([USER EMAIL])

      // Set the property store where authorized tokens should be persisted.
      .setPropertyStore(PropertiesService.getScriptProperties())

      // Set the scope. This must match one of the scopes configured during the
      // setup of domain-wide delegation.
      .setScope('https://www.googleapis.com/auth/script.external_request');
}
我有一个404错误,我想它来自scopes列表。 因此,我无法使用OAuth2.0令牌运行作为API可执行文件部署的脚本。
我应该选择哪些作用域通过HTTP请求运行函数?

在您的
运行
函数中,对于
参数
对象,您应该拥有
有效负载
而不是
游戏加载
  • 您想将应用程序脚本API与服务帐户一起使用
  • 您希望使用谷歌应用程序脚本实现这一点
如果我的理解是正确的,那么这个答案呢?请把这看作是几个可能的答案之一

问题和解决方法: 遗憾的是,在当前阶段,无法将scripts.run-in-Apps脚本API的方法用于服务帐户。如下所示。关于这一点,当我对此进行测试时,我可以确认scripts.run-in-Apps脚本API的方法不能用于服务帐户

警告:应用程序脚本API不适用于服务帐户

从上面的情况来看,作为解决方法,使用OAuth2检索的访问令牌如何?为了将应用程序脚本API与OAuth2一起使用,需要将云平台项目链接到Google应用程序脚本项目。关于这一点,您可以在上看到链接它们的流程

注:
  • 我认为当您使用OAuth2时,非常有用
参考资料:
如果这不是你想要的方向,我道歉

补充:
  • 您希望让多个用户以您的所有者身份运行脚本
从那时起,我可以像上面那样理解。当应用程序脚本API用于上述情况时,需要向每个用户提供凭据信息。当每个用户使用由您的凭证信息检索的访问令牌时,您的目标就可以实现了。但我不能推荐这个。所以在你的情况下,我想用网络应用来实现你的目标。流程如下

1.准备脚本。 请准备你的剧本。例如,在当前阶段,如果要让用户运行
myFunction()
的函数,请放入以下示例脚本

function doGet(e) {
  var values = e; // When you want to give the values by requesting, you can use the event object like "e".
  var res = myFunction(values);
  return ContentService.createTextOutput(res);
}
  • 在这种情况下,使用GET方法。如果只想运行函数,可以使用此脚本。如果要通过提供大数据来运行函数,可以使用
    doPost()
    而不是
    doGet()
2.部署Web应用程序。
  • 在脚本编辑器上,通过“发布”->“部署为web应用”打开对话框
  • 选择“我”以执行应用程序:“”。
    • 这样,脚本将作为所有者运行
    • 这里,当设置“Anyone”时,脚本将作为每个用户运行。在这种情况下,需要将脚本共享给每个用户。并且需要使用访问令牌。请小心这个
  • 为有权访问应用程序的用户选择“任何人,甚至匿名”
    • 在这种情况下,请求时不需要访问令牌。我认为作为测试用例,我推荐这种设置
    • 当然,您也可以使用访问令牌。此时,请将其设置为“任何人”
  • 单击“部署”按钮作为新的“项目版本”
  • 自动打开“需要授权”对话框。
  • 单击“查看权限”
  • 选择自己的帐户
  • 单击“此应用未验证”处的“高级”
  • 单击“转到####项目名称###(不安全)”
  • 单击“允许”按钮
  • 单击“确定”
  • 复制Web应用程序的URL。就像
    https://script.google.com/macros/s/###/exec
    • 当您修改Google Apps脚本时,请重新部署为新版本。这样,修改后的脚本将反映到Web应用程序中。请注意这一点。
  • 3.使用Web应用程序运行该功能。 这是一个示例curl命令,用于对Web应用程序执行
    myFunction
    。请设置您的Web应用URL。在上述Web应用的设置中,每个用户都可以通过以下curl命令进行访问

    curl -GL \
      -d "key=value" \
      "https://script.google.com/macros/s/###/exec"
    
    • key=value
      用作上述查询参数时,在
      doGet(e)
      处,您可以使用
      e.parameter.key
      检索
      value
    参考资料:

    您可以将脚本部署为Web应用程序。要执行此操作,请转到
    Publish>deployaswebapp
    。将
    执行应用程序设置为:
    字段设置为
    Me(youremail)
    。通过这种方式,您可以将脚本作为浏览器链接共享,任何用户都可以使用您的凭据运行脚本


    您可以添加带有确认消息的某个用户界面,以便用户知道他们已成功执行脚本。您可以在此找到文档。

    Hi@yoxCL9,您确定url正确吗?它是scripts/{scriptId}:run,而您的脚本似乎错过了
    /scripts/
    路径部分,从而错过了404错误代码。如果authHi@OlegValter有问题,你应该会收到403,我的错,我之前用projects.get方法检查了一个请求,它可以正常工作。Hi@yoxCL9-我明白了-尽管它看起来与Tanaike的回答没有关系,因为他详细说明了实际的潜在问题(哈,我怎么可能错过了不支持的服务帐户)很抱歉,我错过了此警告,因此如何使用所有者用户凭据与多个用户一起运行脚本?谢谢@Tanaike,但是Google应用程序脚本项目已链接到云平台表单项目,应用程序名称已填入API&Services>Credentials>OAuth同意屏幕。@yoxCL9从您的问题中,我提出了应用程序使用OAuth2编写API脚本。