使用基本身份验证的 Google Apps 脚本中 UrlFetchApp.fetch 出现意外错误

IT技术 javascript google-apps-script basic-authentication urlfetch
2021-02-26 20:41:53

我在 Google Apps Script 中有以下代码,它使用基本身份验证通过 HTTP 从网页中检索 CSV 数据并将其放入电子表格中:

CSVImport.gs

function parseCSVtoSheet(sheetName, url)
{
  // Credentials
  var username = "myusername";
  var password = "mypassword";
  var header = "Basic " + Utilities.base64Encode(username + ":" + password);
  
  // Setting the authorization header for basic HTTP authentication
  var options = {
    "headers": {
      "Authorization": header
    }
  };
  
  // Getting the ID of the sheet with the name passed as parameter
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName(sheetName);
  var sheetId = sheet.getSheetId();
  
  // Getting the CSV data and placing it into the spreadsheet
  var csvContent = UrlFetchApp.fetch(url, options).getContentText();
  var resource = {requests: [{pasteData: {data: csvContent, coordinate: {sheetId: sheetId}, delimiter: ","}}]};
  Sheets.Spreadsheets.batchUpdate(resource, spreadsheet.getId());
}

这一直在工作,直到最近我随机收到以下错误UrlFetchApp.fetch

Exception: Unexpected error: http://www.myurl.com/data/myfile.csv (line 21, file "CSVImport")

我努力了:

  • 将凭据直接放在 URL 中,而不是放在 Authorization 标头中(我收到一个不同的错误,提示“不允许登录信息”)。
  • 当我将凭据传递到 headers 对象时,将凭据编码为 base64(不起作用,同样的错误)。
  • 完全删除身份验证(可以预见的是,我收到了来自 HTTP 页面的 401 响应)。

我不知道还有什么要尝试的,以及为什么会突然突然崩溃。有什么建议吗?

4个回答

这与一个新错误有关,请参见此处

许多用户受到影响,我建议您为该问题“加星标”以提高知名度并希望加快进程。

标记为固定。第377章
2021-04-30 20:41:53
根据来自官方问题跟踪器issuetracker.google.com/issues/175141974 的#346 嘿伙计们,我找到了一个可能对我有用的解决方案尝试输入空 {} 像这样 UrlFetchApp.fetch(apiLink, {}); 它对我有用我试过这个,它也对我有用。即使使用“由 Chrome V8 提供支持的新 Apps 脚本运行时”也能正常工作。
2021-05-08 20:41:53

我有同样的情况。当时我就注意到,当URL使用Google电子表格的内置函数时,可以检索到值。在这种情况下,作为当前的解决方法,我使用了以下流程。

  1. 放一个公式=IMPORTDATA(URL)
  2. 从工作表中检索值。

当上述流程反映到您的 URL 时http://www.myurl.com/data/myfile.csv,它将变为如下所示。

关于 URL 的基本授权:

当我看到您的脚本时,我确认您使用的是基本授权。在这种情况下,用户名和密码可用于 URL,如http://username:password@www.myurl.com/data/myfile.csv

从你的脚本,当的值usernamepasswordmyusernamemypassword分别,你可以使用网址为http://myusername:mypassword@www.myurl.com/data/myfile.csv

在这里,有一个重要的点。如果username中包含特定字符password,请对其进行 url 编码。

示例脚本:

function myFunction() {
  const url = "http://myusername:mypassword@www.myurl.com/data/myfile.csv";  // This is your URL.

  // Retrieve the values from URL.
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName(sheetName);
  sheet.clear();
  var range = sheet.getRange("A1");
  range.setFormula(`=IMPORTDATA("${url}")`);
  
  // Retrieve the values from sheet to an array.
  SpreadsheetApp.flush();
  var values = sheet.getDataRange().getValues();
  range.clear();
  console.log(values)
}
  • 当上面的脚本运行时,来自 URL 的值被放到工作表中,并且这些值被检索为values. 如果您只想保留没有公式的值,我认为您可以复制并粘贴这些值。
  • 在这个答案中,我使用了IMPORTDATA. 但是对于每种情况,其他功能可能也适用。在这种情况下,请检查它们。

笔记:

  • 这是当前的解决方法。所以当这个问题被删除后,我认为你可以使用你原来的脚本。

参考:

禁用 Chrome V8 运行时引擎,直到 Google 修复此问题。

要禁用:从菜单中单击运行>禁用由 Chrome V8 提供支持的新 Apps 脚本运行时

@IrfanAlam 几个小时后,停用 V8 版本使其再次正常工作,当我评论它时仍然没有正面反馈,我将删除我的旧评论。
2021-04-24 20:41:53
请参阅我在issuetracker.google.com/issues/175141974上 #297 的帖子 ,多人确认禁用 V8 对他们有用如果它不适合你,那么你需要等到谷歌解决这个问题。
2021-04-26 20:41:53

根据来自官方问题跟踪器的 #346 https://issuetracker.google.com/issues/175141974

嘿伙计们,我找到了一个可能对我有用的解决方案,尝试输入这样的空 {}

UrlFetchApp.fetch(apiLink, {});

它对我有用

我试过这个,它也对我有用。即使使用“由 Chrome V8 提供支持的新 Apps 脚本运行时”也能正常工作。

要添加基本身份验证或任何身份验证,需要选项部分,将其设为空不会有很多帮助。
2021-04-16 20:41:53