Как разрешить область для GAS для редактирования таблиц Google - PullRequest
1 голос
/ 06 апреля 2020

У меня есть скрипт 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 заняло у меня много времени: (

Несколько соображений:

  1. Функция, которую метод run вызывает Powershell, просто отлично работает, когда я запускаю ее непосредственно из редактора скриптов Google.

  2. Проект сценария развертывается как исполняемый файл API

  3. API Google Apps Script включен в проекте GCP

  4. Он связан со стандартным проектом GCP

  5. Учетные данные OAuth это тип веб-приложения

  6. Скрипт для записи и чтения значений из 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

1 Ответ

2 голосов
/ 07 апреля 2020

Чтобы запустить функцию Google Apps Script (GAS) с помощью Apps Script API, необходимо выполнить несколько сложные настройки. В этом случае я хотел бы предложить для тестирования запустить функцию ГАЗ следующим образом. Этот поток может быть слишком осторожным.

Поток:

  1. Свяжите проект облачной платформы с проектом сценариев Google Apps. Ref
  2. Установка для запуска функции GAS с помощью метода scripts.run в API скриптов Apps. Ref
  3. Поместите скрипт, который вы хотите запустить, в редактор скриптов Google Apps Script.
    • Здесь, пожалуйста, запустите функцию в редакторе сценариев и подтвердите, работает ли сценарий. Таким образом можно избежать проблемы со скриптом.
  4. Поместите следующий скрипт для запуска тестирования. Это используется для 1-го теста API скриптов приложений.

    function test() {
      return "ok";
    }
    
  5. Поместите следующий пример скрипта для получения токена доступа. Это используется для тестирования. Запустите это в редакторе сценариев и скопируйте возвращенный токен доступа.

    function getToken() {
      Logger.log(ScriptApp.getOAuthToken());
    }
    
  6. Тест для запуска функции GAS test() с использованием полученного токена доступа. В этом случае используется сценарий powershell, заменив $accessToken = $GAuthResponse.access_token.

    • . При возникновении ошибки подтвердите настройки API-интерфейса скрипта Apps. В этом случае можно сказать, что скрипт GAS правильный.
    • Если ошибки не возникает, пожалуйста, проверьте, чтобы запустить функцию, которую вы хотите запустить. В этом случае необходимые области уже были включены в токен доступа. Таким образом можно избежать проблем с областями.
  7. Когда вышеуказанный тест будет выполнен и ваш скрипт для использования API сценариев Apps работает, пожалуйста, получите токен refre sh с помощью областей. Области видны в редакторе сценариев. Таким образом, действительный токен доступа может быть получен с помощью токена refre sh. И ваш сценарий можно использовать на локальном сервере P C.

. Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...