如何授权 GAS 编辑 Google 电子表格的范围
How to authorize scope for GAS to edit Google Spreadsheets
我有一个调用 Google App 脚本函数的 Powershell 脚本。
当我 运行 Powershell 脚本时,我可以在我的 GCP 项目的错误报告中看到以下错误:
Exception: You do not have permission to call SpreadsheetApp.getActiveSpreadsheet. Required permissions: (https://www.googleapis.com/auth/spreadsheets.currentonly || https://www.googleapis.com/auth/spreadsheets)
at toSpreadsheet (Código:3)
at fromPS (Código:14)
我明白我必须授权范围,所以我一直在尝试通过编辑清单文件来做到这一点。
Authorization Scopes Documentation 说,
"During the authorization flow, Apps Script presents human-readable descriptions of the required scopes to the user. For example, if your script needs read-only access to your spreadsheets, the manifest may have the scope https://www.googleapis.com/auth/spreadsheets.readonly. During the authorization flow, a script with this scope asks the user to allow this application to "查看您的 Google 电子表格"。"
在我的例子中,我编辑了清单文件 appscript.json 以添加范围 https://www.googleapis.com/auth/spreadsheets,然后保存它,将 Google App Script 项目发布为 API 可执行文件,最后我再次 运行 Powershell 代码,但我仍然得到与上面相同的错误。在所有这些流程中,我没有被要求允许任何事情。我不明白缺少什么授权脚本具有所需的权限。
我还将电子表格范围添加到 OAuth 同意屏幕,但似乎没有任何区别。我怀疑我应该使用服务帐户来完成此操作,因为我认为无法通过 OAuth 客户端验证,因为我在 Google 上的脚本是从 Powershell 脚本调用的。我不想相信这一点,因为了解配置 OAuth2 花了我很多时间:(
一些注意事项:
Powershell 运行 方法调用的函数在我直接从 Google 脚本编辑器 运行 时工作正常。
脚本项目部署为 API 可执行文件
Google Apps 脚本 API 在 GCP 项目中启用
它与标准 GCP 项目相关联
OAuth 凭据是 Web 应用程序类型
从 Powershell 向 Google 表格写入和读取值的脚本工作正常
Google 脚本:
function toSpreadsheet(text2write)
{
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("HIL_APP");
var LastRow = sheet.getLastRow();
for (var i = 1; i < LastRow; i++)
{
sheet.getRange(i+1, 8, 1).setValue(text2write)
}
return "myreturn"
}
function fromPS(params)
{
Logger.log(params)
var rtn = toSpreadsheet(params)
return rtn
}
清单文件:
{
"oauthScopes": [
"https://www.googleapis.com/auth/spreadsheets"
],
"timeZone": "America/Argentina/Buenos_Aires",
"dependencies": {
},
"webapp": {
"access": "ANYONE",
"executeAs": "USER_DEPLOYING"
},
"exceptionLogging": "STACKDRIVER",
"executionApi": {
"access": "MYSELF"
},
"runtimeVersion": "V8"
}
Powershell 代码:
function doit{
$json = ".\client_id.json"
$jdata = get-content $json | convertfrom-json
<#
$jdata | ForEach-Object {
$_.PSObject.Properties.Value
}
#>
$ClientID = $jdata.web.client_id.ToString()
$ClientSecret = $jdata.web.client_secret.ToString()
$refreshToken = "1//04VvG_FTyDGhiCgYIARAAGAQSNwF-L9IrZ-o1kaZQQccvzL5m4TUTNz6b9Q4KCb16t4cH11gGCshWZWvgaCoMlg73FgpLAGOYTEk"
$grantType = "refresh_token"
$requestUri = "https://accounts.google.com/o/oauth2/token"
$GAuthBody = "refresh_token=$refreshToken&client_id=$ClientID&client_secret=$ClientSecret&grant_type=$grantType"
$GAuthResponse = Invoke-RestMethod -Method Post -Uri $requestUri -ContentType "application/x-www-form-urlencoded" -Body $GAuthBody
$accessToken = $GAuthResponse.access_token
$headers = @{"Authorization" = "Bearer $accessToken"
"Content-type" = "application/json"}
$spreadsheetId = "1htbeGlqZ4hojQBWl9fxE4nW_KZI9uVwi0ApzNOIbwnY"
$currentDate = (Get-Date).ToString('MM/dd/yyyy')
$currentTime = (Get-Date).ToString('HH:mm:sstt')
$json = @”
{
"range": "HIL_APP!A1:G1",
"majorDimension": "ROWS",
"values":
[[
"HIL_NAME",
"$env:ComputerName",
"$currentDate",
"$currentTime",
"$env:UserName",
"input from user",
"attempt"
],]
}
“@
$write = Invoke-WebRequest -Uri "https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}/values/HIL_APP!A1:G1:append?valueInputOption=USER_ENTERED" -Method Post -ContentType "application/json" -Body $json -Headers @{"Authorization"="Bearer $accessToken"}
$read = Invoke-WebRequest -Uri "https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}/values/HIL_APP!A1:G1" -Headers @{"Authorization"="Bearer $accessToken"}
$read
Write-Output "read: " ($read.Content | ConvertFrom-Json)
$scriptId = "1eF7ZaHH-pw2-AjnRVhOgnDxBUpfr0wALk1dVFg7B220bg_KuwVudbALh"
$json = @"
{
"function": "fromPS",
"parameters": ["myparam"],
"devMode": true
}
"@
$resp = Invoke-WebRequest -Uri "https://script.googleapis.com/v1/scripts/${scriptId}:run" -Method Post -ContentType "application/json" -Body $json -Headers @{"Authorization"="Bearer $accessToken"}
$resp
Write-Output "script response: " ($resp.Content | ConvertFrom-Json)
}
$error.Clear()
clear
doit
为了运行使用Apps脚本APIGoogleApps脚本(GAS)的功能,需要做一些复杂的设置。在这种情况下,我想建议对 运行 GAS 功能进行如下测试。这个流程可能太小心了。
流量:
- Link 云平台项目到 Google Apps 脚本项目。 Ref
- 使用 Apps 脚本 API 中的 scripts.run 方法安装 GAS 功能 运行。 Ref
- 将您想要的脚本放入 运行 Google Apps 脚本的脚本编辑器。
- 这里请运行脚本编辑器的功能,确认脚本是否运行。这样就可以避免脚本的问题了。
将下面的测试脚本放到运行。这用于 Apps 脚本的第一次测试 API。
function test() {
return "ok";
}
输入以下用于检索访问令牌的示例脚本。这用于测试它。请在脚本编辑器中 运行 并复制返回的访问令牌。
function getToken() {
Logger.log(ScriptApp.getOAuthToken());
}
使用检索到的访问令牌测试 运行 test()
的 GAS 功能。本例通过替换$accessToken = $GAuthResponse.access_token
.
使用powershell的脚本
- 发生错误时,请确认Apps脚本的设置API。在这种情况下,可以说GAS脚本是正确的。
- 如果没有错误发生,请测试运行您想要运行的功能。在这种情况下,所需的范围已包含在访问令牌中。这样就可以避免作用域的问题。
- 完成上述测试并且使用 Apps 脚本 API 的脚本有效后,请使用范围检索刷新令牌。范围可以在脚本编辑器中看到。这样,刷新令牌可以检索有效的访问令牌。并且您的脚本可以在本地PC上使用。
参考文献:
我有一个调用 Google App 脚本函数的 Powershell 脚本。
当我 运行 Powershell 脚本时,我可以在我的 GCP 项目的错误报告中看到以下错误:
Exception: You do not have permission to call SpreadsheetApp.getActiveSpreadsheet. Required permissions: (https://www.googleapis.com/auth/spreadsheets.currentonly || https://www.googleapis.com/auth/spreadsheets)
at toSpreadsheet (Código:3)
at fromPS (Código:14)
我明白我必须授权范围,所以我一直在尝试通过编辑清单文件来做到这一点。
Authorization Scopes Documentation 说,
"During the authorization flow, Apps Script presents human-readable descriptions of the required scopes to the user. For example, if your script needs read-only access to your spreadsheets, the manifest may have the scope https://www.googleapis.com/auth/spreadsheets.readonly. During the authorization flow, a script with this scope asks the user to allow this application to "查看您的 Google 电子表格"。"
在我的例子中,我编辑了清单文件 appscript.json 以添加范围 https://www.googleapis.com/auth/spreadsheets,然后保存它,将 Google App Script 项目发布为 API 可执行文件,最后我再次 运行 Powershell 代码,但我仍然得到与上面相同的错误。在所有这些流程中,我没有被要求允许任何事情。我不明白缺少什么授权脚本具有所需的权限。
我还将电子表格范围添加到 OAuth 同意屏幕,但似乎没有任何区别。我怀疑我应该使用服务帐户来完成此操作,因为我认为无法通过 OAuth 客户端验证,因为我在 Google 上的脚本是从 Powershell 脚本调用的。我不想相信这一点,因为了解配置 OAuth2 花了我很多时间:(
一些注意事项:
Powershell 运行 方法调用的函数在我直接从 Google 脚本编辑器 运行 时工作正常。
脚本项目部署为 API 可执行文件
Google Apps 脚本 API 在 GCP 项目中启用
它与标准 GCP 项目相关联
OAuth 凭据是 Web 应用程序类型
从 Powershell 向 Google 表格写入和读取值的脚本工作正常
Google 脚本:
function toSpreadsheet(text2write)
{
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("HIL_APP");
var LastRow = sheet.getLastRow();
for (var i = 1; i < LastRow; i++)
{
sheet.getRange(i+1, 8, 1).setValue(text2write)
}
return "myreturn"
}
function fromPS(params)
{
Logger.log(params)
var rtn = toSpreadsheet(params)
return rtn
}
清单文件:
{
"oauthScopes": [
"https://www.googleapis.com/auth/spreadsheets"
],
"timeZone": "America/Argentina/Buenos_Aires",
"dependencies": {
},
"webapp": {
"access": "ANYONE",
"executeAs": "USER_DEPLOYING"
},
"exceptionLogging": "STACKDRIVER",
"executionApi": {
"access": "MYSELF"
},
"runtimeVersion": "V8"
}
Powershell 代码:
function doit{
$json = ".\client_id.json"
$jdata = get-content $json | convertfrom-json
<#
$jdata | ForEach-Object {
$_.PSObject.Properties.Value
}
#>
$ClientID = $jdata.web.client_id.ToString()
$ClientSecret = $jdata.web.client_secret.ToString()
$refreshToken = "1//04VvG_FTyDGhiCgYIARAAGAQSNwF-L9IrZ-o1kaZQQccvzL5m4TUTNz6b9Q4KCb16t4cH11gGCshWZWvgaCoMlg73FgpLAGOYTEk"
$grantType = "refresh_token"
$requestUri = "https://accounts.google.com/o/oauth2/token"
$GAuthBody = "refresh_token=$refreshToken&client_id=$ClientID&client_secret=$ClientSecret&grant_type=$grantType"
$GAuthResponse = Invoke-RestMethod -Method Post -Uri $requestUri -ContentType "application/x-www-form-urlencoded" -Body $GAuthBody
$accessToken = $GAuthResponse.access_token
$headers = @{"Authorization" = "Bearer $accessToken"
"Content-type" = "application/json"}
$spreadsheetId = "1htbeGlqZ4hojQBWl9fxE4nW_KZI9uVwi0ApzNOIbwnY"
$currentDate = (Get-Date).ToString('MM/dd/yyyy')
$currentTime = (Get-Date).ToString('HH:mm:sstt')
$json = @”
{
"range": "HIL_APP!A1:G1",
"majorDimension": "ROWS",
"values":
[[
"HIL_NAME",
"$env:ComputerName",
"$currentDate",
"$currentTime",
"$env:UserName",
"input from user",
"attempt"
],]
}
“@
$write = Invoke-WebRequest -Uri "https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}/values/HIL_APP!A1:G1:append?valueInputOption=USER_ENTERED" -Method Post -ContentType "application/json" -Body $json -Headers @{"Authorization"="Bearer $accessToken"}
$read = Invoke-WebRequest -Uri "https://sheets.googleapis.com/v4/spreadsheets/${spreadsheetId}/values/HIL_APP!A1:G1" -Headers @{"Authorization"="Bearer $accessToken"}
$read
Write-Output "read: " ($read.Content | ConvertFrom-Json)
$scriptId = "1eF7ZaHH-pw2-AjnRVhOgnDxBUpfr0wALk1dVFg7B220bg_KuwVudbALh"
$json = @"
{
"function": "fromPS",
"parameters": ["myparam"],
"devMode": true
}
"@
$resp = Invoke-WebRequest -Uri "https://script.googleapis.com/v1/scripts/${scriptId}:run" -Method Post -ContentType "application/json" -Body $json -Headers @{"Authorization"="Bearer $accessToken"}
$resp
Write-Output "script response: " ($resp.Content | ConvertFrom-Json)
}
$error.Clear()
clear
doit
为了运行使用Apps脚本APIGoogleApps脚本(GAS)的功能,需要做一些复杂的设置。在这种情况下,我想建议对 运行 GAS 功能进行如下测试。这个流程可能太小心了。
流量:
- Link 云平台项目到 Google Apps 脚本项目。 Ref
- 使用 Apps 脚本 API 中的 scripts.run 方法安装 GAS 功能 运行。 Ref
- 将您想要的脚本放入 运行 Google Apps 脚本的脚本编辑器。
- 这里请运行脚本编辑器的功能,确认脚本是否运行。这样就可以避免脚本的问题了。
将下面的测试脚本放到运行。这用于 Apps 脚本的第一次测试 API。
function test() { return "ok"; }
输入以下用于检索访问令牌的示例脚本。这用于测试它。请在脚本编辑器中 运行 并复制返回的访问令牌。
function getToken() { Logger.log(ScriptApp.getOAuthToken()); }
使用检索到的访问令牌测试 运行
使用powershell的脚本test()
的 GAS 功能。本例通过替换$accessToken = $GAuthResponse.access_token
.- 发生错误时,请确认Apps脚本的设置API。在这种情况下,可以说GAS脚本是正确的。
- 如果没有错误发生,请测试运行您想要运行的功能。在这种情况下,所需的范围已包含在访问令牌中。这样就可以避免作用域的问题。
- 完成上述测试并且使用 Apps 脚本 API 的脚本有效后,请使用范围检索刷新令牌。范围可以在脚本编辑器中看到。这样,刷新令牌可以检索有效的访问令牌。并且您的脚本可以在本地PC上使用。