У меня есть скрипт Powershell, который вызывает функцию Google App Script.
Когда я запускаю скрипт 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)
Я понял, что должен авторизовать область, поэтому я пытался сделать это, отредактировав файл манифеста.
Документация Области авторизации говорит,
"В процессе авторизации Apps Script представляет пользователю понятные для человека описания необходимых областей. Например, если вашему сценарию необходим доступ только для чтения к вашим электронным таблицам, манифест может иметь область действия https://www.googleapis.com/auth/spreadsheets.readonly. Во время процесса авторизации скрипт с этой областью запрашивает у пользователя разрешение этому приложению «просматривать ваши таблицы Google». "
В моем случае я редактировал файл манифеста appscript. json для добавления области действия https://www.googleapis.com/auth/spreadsheets, затем я сохранил его, опубликовал проект Google App Script как исполняемый файл API и, наконец, запустил Power Код оболочки снова, но я все еще получаю ту же ошибку, что и выше. Во время всего этого потока меня не просили ничего разрешать. Я не могу понять, чего не хватает, авторизуя скрипт, обладающий необходимым разрешением.
Я также добавил область электронных таблиц на экран согласия OAuth, но, похоже, это не имеет значения. Я подозреваю, что должен использовать служебную учетную запись для выполнения sh, поскольку, поскольку я не вижу способа go через OAuth Client Verification, поскольку мой скрипт в Google вызывается из скрипта Powershell. Я не хочу в это верить, потому что знакомство с настройкой OAuth2 заняло у меня много времени: (
Несколько соображений:
Функция, которую метод run вызывает Powershell, просто отлично работает, когда я запускаю ее непосредственно из редактора скриптов Google.
Проект сценария развертывается как исполняемый файл API
API Google Apps Script включен в проекте GCP
Он связан со стандартным проектом GCP
Учетные данные OAuth это тип веб-приложения
Скрипт для записи и чтения значений из Powershell в Google Sheets отлично работает
Скрипт 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