我在谷歌应用程序脚本中有以下代码,它使用基本身份验证通过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时,可以检索值。在这种情况下,作为当前的解决方法,我使用了以下流程。
- 给出
=IMPORTDATA(URL)
的一个公式 - 从图纸中检索值
当以上流反映到http://www.myurl.com/data/myfile.csv
的URL时,它变成如下。
关于URL的基本授权:
当我看到你的脚本时,我确认你使用的是基本授权。在这种情况下,用户名和密码可以用于类似http://username:password@www.myurl.com/data/myfile.csv
的URL。
在脚本中,当username
和password
的值分别为myusername
和mypassword
时,可以将URL用作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
。但对于每种情况,其他功能可能是合适的。那样的话,请检查一下
注意:
- 这是当前的解决方法。所以当这个问题被删除后,我认为你可以使用你的原始脚本
参考文献:
- IMPORTDATA
- setFormula((
在谷歌修复之前禁用Chrome V8运行时引擎。
要禁用:从菜单中单击运行>禁用Chrome V8支持的新应用程序脚本运行时
根据官方问题跟踪器的#346https://issuetracker.google.com/issues/175141974
嘿,伙计们,我找到了一个可行的解决方案,对我来说很有效,试试看像这个一样输入空{}
UrlFetchApp.fetch(apiLink,{}(;
它对我有效
我试过这个,它也对我有效。即使在使用";由Chrome V8提供动力的新的应用程序脚本运行时";。