【问题标题】:Unexpected error on UrlFetchApp.fetch in Google Apps Script using basic authentication使用基本身份验证的 Google Apps 脚本中的 UrlFetchApp.fetch 出现意外错误
【发布时间】:2020-12-15 21:35:01
【问题描述】:

我在 Google Apps 脚本中有以下代码,它使用基本身份验证通过 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 响应)。

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

【问题讨论】:

  • 我遇到了同样的问题,但特别是 CSV 文件。它也不是随机的,从今天 05:16 UTC 开始对我来说一直是一致的。
  • 顺便说一句,您可能希望将 var csvContent = UrlFetchApp.fetch(url, options).getContentText(); 拆分为两行以进行调试,尽管我已经有了它并且它在 fetch() 调用时崩溃了,所以在这种情况下没有什么可收集的.
  • 我在一大早使用 UrlFetchApp 从数据源获取一些股票信息的脚本上遇到了同样的问题。几个月来一直在完美地工作,突然在 12 月 7 日开始出现指向这条线的“意外错误”。我可以确认,当我使用相同的确切 URL 使用 importhtml 手动获取时,我得到了数据。谷歌最终发生了一些变化......但是什么?好的,事实证明这是一个Google issue,它影响了很多人。至少我们并不孤单……
  • @Ploni 我忘了在帖子中提及,但实际上我在调试时确实拆分了这些行,以查看是否有任何问题,但问题确实出在fetch() 上。似乎是 Google 的问题 - 希望它尽快得到解决。
  • 我建议大家给这个问题“加注星标”,请参阅@ziganotschka 回复中的链接

标签: javascript google-apps-script basic-authentication urlfetch


【解决方案1】:

这与一个新错误有关,请参阅here

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

【讨论】:

  • 根据官方问题跟踪器issuetracker.google.com/issues/175141974 的#346@嘿伙计们,我找到了一个可能的解决方案,它对我有用,尝试输入空的 {},例如 UrlFetchApp.fetch(apiLink, {});它对我有用我试过这个,它也对我有用。即使使用“由 Chrome V8 提供支持的新 Apps 脚本运行时”也可以工作。
  • 标记为已修复。 #377
【解决方案2】:

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

  1. 输入公式=IMPORTDATA(URL)
  2. 从工作表中检索值。

当上面的流程反映到你的http://www.myurl.com/data/myfile.csv的URL时,变成如下。

关于URL的基本授权:

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

在您的脚本中,当usernamepassword 的值分别为myusernamemypassword 时,您可以将URL 用作http://myusername:mypassword@www.myurl.com/data/myfile.csv

这里有一个重点。如果usernamepassword中包含特定字符,请对它们进行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。但是对于每种情况,其他功能可能是合适的。在这种情况下,请检查它们。

注意:

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

参考资料:

【讨论】:

    【解决方案3】:

    在 Google 解决此问题之前禁用 Chrome V8 运行时引擎。

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

    【讨论】:

    • issuetracker.google.com/issues/175141974 看到我在#297 的帖子,很多人在那里确认禁用 V8 对他们有用。如果它不适合你,那么你需要等到谷歌解决这个问题。
    • @IrfanAlam 几个小时后,停用 V8 版本使其再次真正起作用,当我评论它仍然没有积极的反馈时,我将删除我的旧评论。
    【解决方案4】:

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

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

    UrlFetchApp.fetch(apiLink, {});

    对我有用

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

    【讨论】:

    • 要添加基本身份验证或任何身份验证,需要选项部分,将其设为空不会有很多帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2015-01-31
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多