【问题标题】:How to deploy Google Sheet as Web-app using Google API如何使用 Google API 将 Google Sheet 部署为 Web 应用程序
【发布时间】:2019-09-30 20:08:23
【问题描述】:

我在使用 Google Sheets API 时遇到了一点问题

我的 GDrive 上有一个 Google 表格文档。我可以使用 Google Sheets API 和 Google Drive API 来处理它。所以我可以移动它、更新它或复制它。

我的任务是: 1. 复印这份文件(我可以这样做) 2. 将此副本发布为网络应用程序。所以每个副本内部都有一个doGet() 函数,因此它可以作为Web 应用程序发布。手动可以这样做:Publish -> Deploy as web app.. 但我找不到任何 API 来执行此操作。

  1. 获取已发布服务的 URL

更新

我阅读了文档projects.deployments.create 并且我想创建一个新部署(在此之前我应该​​创建一个版本)但是我的新部署没有网络访问权限,没有 URL 等。如果我通过projects.deployments.list 检查它显示:

{
  "deploymentId": "AKfycbxVfuoeIQmumgy_Efhw12NCcqE7vqosYoxbDiKj5CT4mL_GbtybXsh1ppMIX22wQX20",
  "deploymentConfig": {
    "scriptId": "1zfjbALVe0jGbZCtqjFR0RP2-O___hR7MtAlx3biuJGXKsrKh3y1W0hMT",
    "versionNumber": 1,
    "manifestFileName": "appsscript",
    "description": "v1"
  },
  "updateTime": "2019-05-13T22:33:23.760Z"
}

如果我通过网络界面手动执行此操作,它将看起来像

{
  "deploymentId": "AKfycbyn3smPKxJcZwsm9SzSTtzNCAcWJzf1OVs4WTslvHo",
  "deploymentConfig": {
    "scriptId": "1zfjbALVe0jGbZCtqjFR0RP2-O___hR7MtAlx3biuJGXKsrKh3y1W0hMT",
    "manifestFileName": "appsscript"
  },
  "updateTime": "1970-01-01T00:00:00Z",
  "entryPoints": [
    {
      "entryPointType": "WEB_APP",
      "webApp": {
        "url": "https://script.google.com/macros/s/AKfycbyn3smPKxJcZwsm9SzSTtzNCAcWJzf1OVs4WTslvHo/exec",
        "entryPointConfig": {
          "access": "ANYONE_ANONYMOUS",
          "executeAs": "USER_DEPLOYING"
        }
      }
    }
  ]
}

【问题讨论】:

标签: google-apps-script web-applications google-drive-api google-sheets-api google-apps-script-api


【解决方案1】:

需要使用 Apps Script API。您可以使用 REST API 并发出 UrlFetchApp.fetch(url) 请求。这是一个两步过程。首先,您必须创建一个新的 Apps 脚本文件,然后您必须使用清单文件中的新内容更新该新的 Apps 脚本文件。清单文件必须具有 webapp 的属性,该属性用于指定部署类型。

代码可能如下所示:

function deployA_project() {
  var id, OAuthToken,options,payload,rtrn,url;

  id = ScriptApp.getScriptId();//Get the project ID of this script project
  Logger.log('id: ' + id)

  url = 'https://script.googleapis.com/v1/projects/' + id + '/deployments';//For REST

  OAuthToken = ScriptApp.getOAuthToken();

  payload = {
    "versionNumber": number,
    "manifestFileName": string,
    "description": string
  }

  options = {
    "method" : "POST",
    "muteHttpExceptions": true,
    "headers": {
      'Authorization': 'Bearer ' +  OAuthToken
    },
    "contentType": "application/json",
    "payload": JSON.stringify(payload)
  };

  rtrn = UrlFetchApp.fetch(url,options);

  Logger.log('rtrn: ' + rtrn)


}

查看文档: projects.deployments.create

应用脚本项目的部署方式在清单文件中指定:

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "webapp": {
    "access": "MYSELF",
    "executeAs": "USER_DEPLOYING"
  },
  "exceptionLogging": "STACKDRIVER"
}

API 不提供用于创建部署类型的配置设置。因此,将部署转变为 Web 应用程序是通过更新清单文件来完成的。这必须是一个两步过程。首先,创建新项目文件,然后使用文件内容的 JSON 对象对其进行更新。您可以指定名为“appsscript.json”的清单文件的文件内容

内容必须是JSON格式,格式如下:

{
  "scriptId": "scriptId",
  "files": [{
    "name": "appsscript",
    "type": "JSON",
    "source": "{\"timeZone\":\"America/New_York\", \"webapp\": {\"access\": \"MYSELF\",\"executeAs\": \"USER_DEPLOYING\"},\"exceptionLogging\":\"STACKDRIVER\"}",
    "lastModifyUser": {
      "name": "MyName",
      "email": "example@gmail.com",
    }
  }]
}

您需要向不同的 url 发出另一个请求,并且该请求必须是 PUT 请求才能进行更新:

  url = 'https://script.googleapis.com/v1/projects/' + id + '/deployments/' + {deploymentId}

  var newContent = {
    "scriptId": "scriptId",
    "files": [{
      "name": "appsscript",
      "type": "JSON",
      "source": "{\"timeZone\":\"America/New_York\", \"webapp\": {\"access\": \"MYSELF\",\"executeAs\": \"USER_DEPLOYING\"},\"exceptionLogging\":\"STACKDRIVER\"}",
      "lastModifyUser": {
        "name": "MyName",
        "email": "example@gmail.com",
      }
    }]
  }

  var requestBody = {};
  requestBody.files = newContent;

  requestBody.deploymentConfig = {
      "scriptId": string,
      "versionNumber": number,
      "manifestFileName": string,
      "description": string
    }

  options = {
    "method" : "PUT",
    "muteHttpExceptions": true,
    "headers": {
      'Authorization': 'Bearer ' +  OAuthToken
    },
    "contentType": "application/json",
    "payload": JSON.stringify(requestBody)
  };

  rtrn = UrlFetchApp.fetch(url,options);

  Logger.log('rtrn: ' + rtrn)

【讨论】:

  • 谢谢。我设法创建了一个部署,但我不知道下一步该做什么。我的部署中没有 Web 入口点。我已经更新了我的帖子。
猜你喜欢
  • 2023-03-11
  • 2017-03-31
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
  • 2021-01-05
  • 2020-01-30
  • 2020-08-08
相关资源
最近更新 更多