Ошибка API REST: Invoke-WebRequest: 404 - PullRequest
2 голосов
/ 31 марта 2020

Код Powershell ниже записывает и считывает значения в Google Sheets (работает нормально) и должен запускать функцию myfunction в проекте скрипта Apps с использованием API, но Invoke-WebRequest возвращает ошибку ниже:

Invoke-WebRequest : 404. That’s an error. The requested URL /v1/scripts/=ya29.a0Ae4lvC3k8aahOCPBgf-tRf4SRFxdcCE97fkbXLAJqZ4zRCLnBp9prwEcBYBAf
lYP6zyW3fLeD3u4iSw5jYtDAdgZiSsTjzQbCpj9e_ahCA0xwC_1NBTjYkPwqFdLli7LNpfFcuedFDhdUpfnKTRZdbBWIf2ZyxyuGc6p was not found on this server. That’s 
all we know.
No C:\Users\F76254C\Desktop\Nova pasta\Batch files\Available Projects\Latam HIL Lab Menu\libs\Google\WriteToGoogleSheets.ps1:64 caractere:13
+     $resp = Invoke-WebRequest -Uri "https://script.googleapis.com/v1/ ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

Я не уверен, правильно ли задано JSON представление тела запроса или ошибка была вызвана чем-то другим.

Код 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"}

    $DocumentID = "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/$DocumentID/values/HIL_APP!A1:G1:append?valueInputOption=USER_ENTERED&access_token=$($accessToken)" -Method Post -ContentType "application/json" -Body $json
    $read = Invoke-WebRequest -Uri "https://sheets.googleapis.com/v4/spreadsheets/$DocumentID/values/HIL_APP!A1:G1?access_token=$($accessToken)"
    Write-Output "Response: " ($read.Content | ConvertFrom-Json)

$scriptId = "1eF7ZaHH-pw2-AjnRVhOgnDxBUpfr0wALk1dVFg7B220bg_KuwVudbALh"

$json = @”
{
  "function": "myfunction",
  "parameters": [
    "attempt" string
  ],
  "devMode": true
}
“@

    $resp = Invoke-WebRequest -Uri "https://script.googleapis.com/v1/scripts/$scriptId:run?access_token=$($accessToken)" -Method Post -ContentType "application/json" -Body $json
#    Write-Output "Response: " ($resp.Content | ConvertFrom-Json)
}

clear

doit

РЕДАКТИРОВАТЬ :

Код скрипта Google App:

function toSpreadsheet(text2write)
  {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("HIL_APP");

  for (var i = 1; i < sheet.getLastRow(); i++)
  {
    sheet.getRange(i+1, 8, 1).setValue(text2write)
  }
  return "myreturn"
}

function myfunction(params)
{
  toSpreadsheet(params)
}

1 Ответ

4 голосов
/ 31 марта 2020
  • Вы можете подтвердить, что скрипт для записи и чтения значений для Google Sheets работал нормально.
  • Вы хотите изменить только скрипт для запуска Google Apps Script, используя Apps Script API.
    • Вы уже можете использовать API скриптов приложений.
    • Ваш токен доступа можно использовать для запуска скрипта Google Apps.
  • Вы хотите чтобы достичь этого, используя Invoke-WebRequest powershell.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Точки модификации:

  • Из вашего сообщения об ошибке и вашего сценария я хотел бы предложить следующие точки модификации.
    1. От "https://script.googleapis.com/v1/scripts/$scriptId:run?access_token=$($accessToken)" до "https://script.googleapis.com/v1/scripts/${scriptId}:run"
      • В вашем сценарии конечная точка равна https://script.googleapis.com/v1/scripts/. Это неполная конечная точка.
      • Я думаю, что причина вашего текущего сообщения об ошибке заключается в следующем.
    2. Пожалуйста, используйте токен доступа в заголовке запроса вместо параметр запроса. Ref
      • Я думаю, что это можно сказать и об использовании Sheets API.
    3. Я думаю, что "attempt" string - это "attempt".
    4. Пожалуйста, измените на ".

Модифицированный скрипт:

Когда запрос API скриптов Apps в вашем скрипте изменено, это становится следующим.

$scriptId = "1eF7ZaHH-pw2-AjnRVhOgnDxBUpfr0wALk1dVFg7B220bg_KuwVudbALh"

$json = @"
{
  "function": "myfunction",
  "parameters": ["attempt"],
  "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}"}

Примечание:

  • В моей среде, я мог бы подтвердить, что вышеупомянутый измененный скрипт работал. К сожалению, я не могу понять, как вы настроили запуск скрипта Google Apps с помощью API скриптов Apps. Поэтому, если в вашей среде произошла ошибка, пожалуйста, подтвердите настройки для запуска скрипта с помощью Apps Script API, снова.
  • Я думаю, что "Bearer ${accessToken}" также можно изменить на "Bearer $accessToken".

Ссылка:

Если я неправильно понял ваш вопрос, и это не было прямым решением из вашей проблемы, я прошу прощения.

...