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



我在谷歌应用程序脚本中有以下代码,它使用基本身份验证通过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中,而不是放在授权标头中(我收到另一个错误,说"登录信息被禁止"(
  • 当我将凭据传递到headers对象时,将其编码为base64(不起作用,同样的错误(
  • 完全取消身份验证(不出所料,我收到了来自HTTP页面的401响应(

我不知道还能尝试什么,也不知道为什么会突然突然崩溃。有什么建议吗?

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

许多用户受到影响,我建议您"星形;提高知名度并有望加快这一进程。

我也有同样的情况。当时,我可以注意到,当谷歌电子表格的内置功能用于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。但对于每种情况,其他功能可能是合适的。那样的话,请检查一下

注意:

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

参考文献:

  • IMPORTDATA
  • setFormula((

在谷歌修复之前禁用Chrome V8运行时引擎。

要禁用:从菜单中单击运行>禁用Chrome V8支持的新应用程序脚本运行时

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

嘿,伙计们,我找到了一个可行的解决方案,对我来说很有效,试试看像这个一样输入空{}

UrlFetchApp.fetch(apiLink,{}(;

它对我有效

我试过这个,它也对我有效。即使在使用";由Chrome V8提供动力的新的应用程序脚本运行时";。

最新更新