REST API 失败:调用 WebRequest:404
REST API failure: Invoke-WebRequest : 404
下面的 Powershell 代码将值写入和读取到 Google 工作表(工作正常)并且应该 运行 Apps 脚本项目中的函数 myfunction
使用 API,但是 Invoke-WebRequest
returns 错误如下:
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 应用程序脚本代码:
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)
}
- 您可以确认用于写入和读取 Google 工作表值的脚本工作正常。
- 您只想使用 Apps 脚本 API 修改 运行 宁 Google Apps 脚本的脚本。
- 您已经能够使用 Apps 脚本 API。
- 您的访问令牌可用于 运行 宁 Google Apps 脚本。
- 您想使用
Invoke-WebRequest
的 powershell 实现此目的。
修改点:
- 根据你的错误信息和你的脚本,我想提出以下修改点。
- 从
"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/
。这是不完整的端点。
- 我认为您当前的错误消息的原因是由于此。
- 请在请求中使用访问令牌 header 而不是查询参数。 Ref
- 我认为这也适用于使用表格 API。
- 我认为
"attempt" string
是 "attempt"
。
- 请将
”
修改为"
。
修改后的脚本:
当你的脚本中对Apps Script API的请求修改后,变成如下。
$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}"}
注:
- 在我的环境中,我可以确认上面修改的脚本有效。不幸的是,我无法理解您将 运行 与 Apps 脚本 API 设置为 Google Apps 脚本的流程。因此,如果在您的环境中出现错误,请再次确认 运行使用 Apps 脚本 API 连接脚本的设置。
- 我认为
"Bearer ${accessToken}"
也可以修改为"Bearer $accessToken"
。
参考:
下面的 Powershell 代码将值写入和读取到 Google 工作表(工作正常)并且应该 运行 Apps 脚本项目中的函数 myfunction
使用 API,但是 Invoke-WebRequest
returns 错误如下:
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 应用程序脚本代码:
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)
}
- 您可以确认用于写入和读取 Google 工作表值的脚本工作正常。
- 您只想使用 Apps 脚本 API 修改 运行 宁 Google Apps 脚本的脚本。
- 您已经能够使用 Apps 脚本 API。
- 您的访问令牌可用于 运行 宁 Google Apps 脚本。
- 您想使用
Invoke-WebRequest
的 powershell 实现此目的。
修改点:
- 根据你的错误信息和你的脚本,我想提出以下修改点。
- 从
"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/
。这是不完整的端点。 - 我认为您当前的错误消息的原因是由于此。
- 在您的脚本中,终点是
- 请在请求中使用访问令牌 header 而不是查询参数。 Ref
- 我认为这也适用于使用表格 API。
- 我认为
"attempt" string
是"attempt"
。 - 请将
”
修改为"
。
- 从
修改后的脚本:
当你的脚本中对Apps Script API的请求修改后,变成如下。
$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}"}
注:
- 在我的环境中,我可以确认上面修改的脚本有效。不幸的是,我无法理解您将 运行 与 Apps 脚本 API 设置为 Google Apps 脚本的流程。因此,如果在您的环境中出现错误,请再次确认 运行使用 Apps 脚本 API 连接脚本的设置。
- 我认为
"Bearer ${accessToken}"
也可以修改为"Bearer $accessToken"
。