gpt4 book ai didi

powershell - 如何为GAS授权范围以编辑Google Spreadsheets

转载 作者:行者123 更新时间:2023-12-03 00:57:21 30 4
gpt4 key购买 nike

我有一个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)

我知道我必须授权范围,因此我一直在尝试通过编辑 list 文件来做到这一点。

Authorization Scopes Documentation说,

“在授权流程中,Apps脚本会向用户提供所需范围的人类可读描述。例如,如果您的脚本需要对电子表格进行只读访问,则 list 可能具有 https://www.googleapis.com/auth/spreadsheets.readonly范围。在授权流程中,具有此范围的脚本要求用户允许该应用程序“查看您的Google Spreadsheets”。

在我的情况下,我编辑了 list 文件appscript.json以添加范围 https://www.googleapis.com/auth/spreadsheets,然后将其保存,将Google App Script项目发布为API Executable,最后再次运行Powershell代码,但是仍然遇到与上述相同的错误。在所有这些流程中,没有要求我允许任何操作。我无法理解授权脚本缺少所需权限的缺失。

我还向OAuth同意屏幕添加了电子表格范围,但似乎没有任何区别。我怀疑我应该使用服务帐户来完成此操作,因为从Powershell脚本调用了我在Google上的脚本,因此我看不到要通过OAuth客户端验证的方法。我不想相信这一点,因为了解OAuth2的配置花了我很多时间:(

一些注意事项:
  • 当我直接从Google脚本编辑器运行它时,Powershell的run方法调用的函数运行良好。
  • 脚本项目作为API可执行文件
  • 部署
  • 在GCP项目
  • 中启用了Google Apps脚本API
  • 它与标准GCP项目
  • 相关联
  • OAuth凭据是Web应用程序类型
  • 用于将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
    }

    list 文件:
    {
    "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 Script API运行Google Apps Script(GAS)的功能,需要进行一些复杂的设置。在这种情况下,我想提出如下测试以运行GAS功能。此流程可能过于谨慎。

    流:

  • 将Cloud Platform项目链接到Google Apps脚本项目。 Ref
  • 安装此程序,以通过Apps Script API中的scripts.run方法运行GAS功能。 Ref
  • 将要运行的脚本放入Google Apps脚本的脚本编辑器。
  • 在这里,请通过脚本编辑器运行该函数并确认脚本是否有效。这样,可以避免脚本的问题。
  • 将以下脚本进行测试以运行。这用于Apps Script API的第一次测试。
    function test() {
    return "ok";
    }
  • 放入以下示例脚本来检索访问 token 。用于测试它。请在脚本编辑器中运行此命令,然后复制返回的访问 token 。
    function getToken() {
    Logger.log(ScriptApp.getOAuthToken());
    }
  • 测试以使用检索到的访问 token 运行test()的GAS功能。在这种情况下,通过替换$accessToken = $GAuthResponse.access_token来使用powershell脚本。
  • 发生错误时,请确认Apps Script API的设置。在这种情况下,可以说GAS脚本是正确的。
  • 如果没有错误发生,请测试运行您要运行的功能。在这种情况下,所需的作用域已经包含在访问 token 中。这样,可以避免范围问题。
  • 完成上述测试,并且您使用Apps Script API的脚本正常工作后,请使用作用域检索刷新 token 。范围可以在脚本编辑器中看到。这样,可以通过刷新 token 检索有效的访问 token 。您的脚本可以在本地PC上使用。

  • 引用文献:
  • Linking Cloud Platform Project to Google Apps Script Project
  • Executing Functions using the Apps Script API
  • 关于powershell - 如何为GAS授权范围以编辑Google Spreadsheets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61049670/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com