使用基本身份验证的 Google Apps 脚本中的 UrlFetchApp.fetch 出现意外错误
Unexpected error on UrlFetchApp.fetch in Google Apps Script using basic authentication
我在 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 而不是授权 header 中(我收到了一个不同的错误,提示“不允许登录信息”)。
- 当我将凭据传递到 headers object 时,将凭据编码为 base64(没用,同样的错误)。
- 完全删除身份验证(可以预见我从 HTTP 页面收到了 401 响应)。
我不确定还可以尝试什么,也不知道为什么它会突然随机崩溃。有什么建议吗?
这与一个新错误有关,请参阅 here
许多用户受到影响,我建议您给问题“加注星标”以提高知名度并希望加快进程。
禁用 Chrome V8 运行时间引擎,直到 Google 修复此问题。
禁用:
从菜单中单击 运行 > 禁用由 Chrome V8
提供支持的新 Apps 脚本运行时
我遇到了同样的情况。当时,我注意到当 Google Spreadsheet 的内置函数用于 URL 时,可以检索值。在那种情况下,作为当前的解决方法,我使用了以下流程。
- 输入
=IMPORTDATA(URL)
. 的公式
- 从 sheet 中检索值。
当上面的流量反映到你http://www.myurl.com/data/myfile.csv
的URL时,就变成了这样
关于 URL 的基本授权:
当我看到你的脚本时,我确认你使用的是基本授权。在这种情况下,用户名和密码可以用于URL,如http://username:password@www.myurl.com/data/myfile.csv
。
根据您的脚本,当 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 的值被放入 sheet,并且这些值被检索为
values
的二维数组。如果你只想保留没有公式的值,我认为你可以复制并粘贴这些值。
- 在这个回答中,我使用了
IMPORTDATA
。但对于每种情况,其他功能可能是合适的。在这种情况下,请检查它们。
注:
- 这是当前的解决方法。所以当这个问题被移除后,我认为你可以使用你原来的脚本。
参考文献:
根据来自官方问题跟踪器的#346 https://issuetracker.google.com/issues/175141974
hey guys I have found a possible solution that is working for me try
inputting empty {} like this
UrlFetchApp.fetch(apiLink, {});
it worked for me
我试过了,它也对我有用。即使在使用“由 Chrome V8 提供支持的新 Apps 脚本运行时”时也能正常工作。
我在 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 而不是授权 header 中(我收到了一个不同的错误,提示“不允许登录信息”)。
- 当我将凭据传递到 headers object 时,将凭据编码为 base64(没用,同样的错误)。
- 完全删除身份验证(可以预见我从 HTTP 页面收到了 401 响应)。
我不确定还可以尝试什么,也不知道为什么它会突然随机崩溃。有什么建议吗?
这与一个新错误有关,请参阅 here
许多用户受到影响,我建议您给问题“加注星标”以提高知名度并希望加快进程。
禁用 Chrome V8 运行时间引擎,直到 Google 修复此问题。
禁用: 从菜单中单击 运行 > 禁用由 Chrome V8
提供支持的新 Apps 脚本运行时我遇到了同样的情况。当时,我注意到当 Google Spreadsheet 的内置函数用于 URL 时,可以检索值。在那种情况下,作为当前的解决方法,我使用了以下流程。
- 输入
=IMPORTDATA(URL)
. 的公式
- 从 sheet 中检索值。
当上面的流量反映到你http://www.myurl.com/data/myfile.csv
的URL时,就变成了这样
关于 URL 的基本授权:
当我看到你的脚本时,我确认你使用的是基本授权。在这种情况下,用户名和密码可以用于URL,如http://username:password@www.myurl.com/data/myfile.csv
。
根据您的脚本,当 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 的值被放入 sheet,并且这些值被检索为
values
的二维数组。如果你只想保留没有公式的值,我认为你可以复制并粘贴这些值。 - 在这个回答中,我使用了
IMPORTDATA
。但对于每种情况,其他功能可能是合适的。在这种情况下,请检查它们。
注:
- 这是当前的解决方法。所以当这个问题被移除后,我认为你可以使用你原来的脚本。
参考文献:
根据来自官方问题跟踪器的#346 https://issuetracker.google.com/issues/175141974
hey guys I have found a possible solution that is working for me try inputting empty {} like this
UrlFetchApp.fetch(apiLink, {});
it worked for me
我试过了,它也对我有用。即使在使用“由 Chrome V8 提供支持的新 Apps 脚本运行时”时也能正常工作。