google-apps-script - 如何使用 Google API 将 Google Sheet 部署为 Web 应用程序
问题描述
我对 Google Sheets API 有一点问题
我的 GDrive 上有一个 Google Sheet 文档。我可以使用 Google Sheets API 和 Google Drive API 来处理它。所以我可以移动它、更新它或复制它。
我的任务是: 1. 制作此文档的副本(我可以这样做) 2. 将此副本发布为 Web 应用程序。因此,每个副本doGet()
内部都有一个功能,因此可以将其发布为 Web 应用程序。手动可以这样做:发布 - >部署为网络应用程序..但我找不到任何API来做到这一点。
- 获取已发布服务的 URL
更新
我阅读了文档projects.deployments.create并且我想创建一个新部署(在此之前我应该创建一个版本)但是我的新 deployemnt 没有 Web 访问权限,没有 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"
}
}
}
]
}
解决方案
需要使用 Apps 脚本 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)
推荐阅读
- docker - 如何在不重建映像的情况下修改 docker 健康检查?
- python - 如何评估高度不平衡数据的准确性(使用朴素贝叶斯模型)?
- javascript - PHP/JQuery - 输入“U”时禁用按钮
- swift - Swift singlelinkedlist 节点未切断列表
- c# - 乘法赋值运算符不尊重数学优先级
- c# - 如何判断玩家(白色立方体)是否在 Unity 中的有效位置(透明立方体)内?
- c# - HttpWebRequest StreamReader 进度百分比
- javascript - 如何一次遍历一个字符串?
- f# - 如何在 f# 中将 File.ReadAllLines 的结果设置为 ResizeArray 或 Array?
- sql - 计算每个项目组的月数