【问题标题】:Receiving a 401 'truncated server' response in Google Apps Scripts在 Google Apps 脚本中接收 401“截断服务器”响应
【发布时间】:2021-05-21 22:05:01
【问题描述】:

我有这个代码。

  function method3()
  {
    var spreadsheetID = '1BGi80ZBoChrMXGOyCbu2pn0ptIL6uve2ib62gV-db_o';
    var sheetName = 'Form Responses 1';
    var queryColumnLetterStart = 'A';
    var queryColumnLetterEnd = 'C';
    var query = 'select * where B = "8"';

    // don't provide last row in range selection
    var qvizURL = 'https://docs.google.com/spreadsheets/d/' + spreadsheetID + '/gviz/tq?tqx=out:json&headers=1&sheet=' + sheetName + '&range=' + queryColumnLetterStart + ":" + queryColumnLetterEnd + '&tq=' + encodeURIComponent(query);//(myQuery);
    Logger.log('qvizURL: ' + qvizURL);
  options = {muteHttpExceptions: true};

    // fetch the data
    Logger.log(ScriptApp.getOAuthToken());
    var ret = UrlFetchApp.fetch(qvizURL, { headers: {Authorization: 'Bearer ' + ScriptApp.getOAuthToken()}}).getContentText();
    Logger.log('ret: ' + ret);

    var obj1 = JSON.parse(ret.replace("/*O_o*/", "").replace("google.visualization.Query.setResponse(", "").slice(0, -2));
    Logger.log('obj1:');
    Logger.log(obj1);
    var data = obj1.table.rows;
    Logger.log('#rows: ' + data.length);

    for(var i=0;i<data.length;i++) {
      values.push({ts:obj.table.rows[i].c[0].f, cs:obj.table.rows[i].c[1].v, or:obj.table.rows[i].c[2].v})
      Logger.log(i+': ' + values[i][ts] + ' || ' + values[i][cs] + ' || ' + values[i][or] + ' || ');
    }
  }

记录器:

18 feb. 2021 22:33:44   Informatie  qvizURL: https://docs.google.com/spreadsheets/d/1BGi80ZBoChrMXGOyCbu2pn0ptIL6uve2ib62gV-db_o/gviz/tq?tqx=out:json&headers=1&sheet=Form Responses 1&range=A:C&tq=select%20*%20where%20B%20%3D%20%228%22
18 feb. 2021 22:33:44   Informatie  ya29.A0AfH6SMBGpL2mxU7DO5p8RQfCXKP1w13wmU6aBTVZSCjfO-uj_xzkYQziMhnXATEdGREibJk9cATEGioTfQG4aGsNq7Tm05_oD0z1HKu1v4ozBF_B2XegyQ-NuXBJFmJWTX5WEpTOm0RDTlfY6uw8lK3R5HTV
18 feb. 2021 22:33:44   Fout    Exception: Request failed for https://docs.google.com returned code 401. Truncated server response: <HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
 (use muteHttpExceptions option to examine full response)
    at method3(QueryTable:16:27)

尝试添加“muteHttpExceptions:true”。但这只是显示了我获取的 url 中的 HTML。被截断,没有显示任何线索。

我是否需要在某个地方为此 UrlFetch 授权?

****更新***

一切都是用同一个帐户创建的。

这是清单 (appscript.json) 的初始版本:

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"}

然后我添加了 oauthScopes 正如我在https://developers.google.com/apps-script/concepts/scopes#viewing_scopes上看到的那样

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
      "https://www.googleapis.com/auth/spreadsheets.readonly",
      "https://www.googleapis.com/auth/userinfo.email"
  ]
}

这产生了:“例外:您无权调用 UrlFetchApp.fetch。所需权限:googleapis.com/auth/script.external_request”。

所以我加了

      "https://www.googleapis.com/auth/script.external_request"

这产生了最初的错误消息:异常:https://docs.google.com 的请求失败返回代码 401。截断的服务器响应:...

所以我猜我需要对 oauthScopes 进行更多微调...查看了 https://developers.google.com/workspace/add-ons/concepts/gsuite-scopes#editor_scopes,但不知道该怎么做...

【问题讨论】:

  • 很遗憾,我无法理解It is almost identical to code I run in another Google Script, which works fine. But this one generates an error.。我为此道歉。请问It is almost identical to code I run in another Google Script, which works fine.But this one generates an error.的区别?
  • 如果你得到一个 401,那么你当然没有被授权,你需要授权请求。无论是由于云端硬盘文件共享问题还是由于脚本清单中缺少 OAuth 范围授权,执行此脚本的人都无权访问该文件。
  • 你好 Tanike。忽略那个。 (我删除了评论)。如果我通过 formSubmit 触发该功能,则代码可以正常工作。当我从 AppScript 手动运行它时,我得到了错误。
  • @tehhowch。我确实得到了那个 OAuth。我从构建代码的同一个帐户触发它。我需要更改某个设置吗?
  • 所以我关注了这个developers.google.com/apps-script/concepts/scopes。然后我收到这条消息:“例外:您无权调用 UrlFetchApp.fetch。所需权限:googleapis.com/auth/script.external_request”。所以我也在脚本清单中添加了“googleapis.com/auth/script.external_request”,但随后又得到了原来的错误消息......

标签: javascript google-apps-script


【解决方案1】:

您的凭据无效,请改用表格高级服务

401(未授权)状态码表示该请求没有被应用,因为它缺少目标资源的有效身份验证凭据。

在接收到不足以获得访问权限的有效凭据的另一端服务器上,应该使用 403(禁止访问)状态代码进行响应。

正如我在您的代码中看到的,您希望通过获取 JSON 格式的电子表格范围来迭代您的工作表数据。我建议您在 Google Apps 脚本中使用表格高级服务并进行以下更改:

点击Services +并添加Sheets API V4。

通过 Google Apps 脚本中的 Sheets API 获取值,然后过滤

function SheetsAdvancedService()
{
  var spreadsheetID = 'ID';
  var sheetName = 'Form Responses 1';
  var queryColumnLetterStart = 'A';
  var queryColumnLetterEnd = 'C';

  var sheetRangeResponse = Sheets.Spreadsheets.Values.get(spreadsheetID, `${sheetName}!${queryColumnLetterStart}:${queryColumnLetterEnd}`);
  if (sheetRangeResponse.values) {
    var filteredData = sheetRangeResponse.values.filter(row => row[1] == 8) // select * where B = "8"
    Logger.log(filteredData);
    // Handle data ...
    // Or use forEach instead of filter for efficiency
  } else {
    Logger.log("No values");
  }
}

或者使用 SheetsApp 再过滤

function SheetsThroughGoogleAppsScript()
{
  var spreadsheetID = 'ID';
  var sheetName = 'Form Responses 1';

  var ss = SpreadsheetApp.openById(spreadsheetID);
  var sheets = ss.getSheetByName(sheetName);
  var range = sheets.getDataRange().getValues();
  if (range) {
    var filteredData = range.filter(row => row[1] == 8) // select * where B = "8"
    Logger.log(filteredData);
    // Handle data and filter columns ...
    // Or use forEach instead of filter for efficiency
  } else {
    Logger.log("No values");
  }
}

参考文献

【讨论】:

  • 谢谢何塞。我简单地看了看它。可能是个不错的出路。由于其他优先事项,稍后会再看一遍。
猜你喜欢
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
相关资源
最近更新 更多