У меня есть следующий код в скрипте Google Apps, который извлекает данные CSV с веб-страницы через HTTP с использованием базовой аутентификации и помещает их в электронную таблицу:
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")
Я пытался:
Я не уверен, что еще попробовать и почему это внезапно сломалось. Любой совет?
Кроме того, вы можете разделить var csvContent = UrlFetchApp.fetch(url, options).getContentText();
на две строки для целей отладки, хотя у меня это уже есть, и оно падает при вызове fetch()
, поэтому в этом случае особо нечего собирать.
У меня такая же проблема со сценарием, который использует UrlFetchApp рано утром для получения некоторой информации об акциях из источника данных. Работает безупречно в течение нескольких месяцев, и вдруг 7 декабря начала появляться «неожиданная ошибка», указывающая на эту строку. Я могу подтвердить, что когда я использовал тот же точный URL-адрес для ручной выборки с помощью importhtml, я получаю данные. Что-то изменилось со стороны Google... но что? Итак, оказывается, это проблема Google, которая затрагивает многих людей. По крайней мере, мы не одиноки...
@Ploni Я забыл упомянуть в посте, но я действительно разделил эти строки во время отладки, чтобы увидеть, есть ли какие-либо проблемы, но проблема действительно с fetch()
. Похоже, это проблема Google, будем надеяться, что она скоро будет исправлена.
Я рекомендую всем "пометить" проблему, см. ссылку в ответе @ziganotschka.
Хотя, к сожалению, я не могу проверить ваш URL-адрес, в качестве ответа я предложил текущий обходной путь. Не могли бы вы подтвердить это? Если это не было полезно для вашей ситуации, я извиняюсь.
Затронуты многие пользователи, я рекомендую вам пометить проблему звездочкой, чтобы повысить ее заметность и, надеюсь, ускорить процесс.
Согласно # 346 из официального трекера проблем issuetracker.google.com/issues/175141974 эй, ребята, я нашел возможное решение, которое работает для меня, попробуйте ввести пустой {}, например, UrlFetchApp.fetch(apiLink, {}) ; это сработало для меня, я попробовал это, и это тоже работает для меня. Работает даже при использовании «новой среды выполнения скриптов приложений на базе Chrome V8».
Помечено Исправлено. #377
Отключите механизм выполнения Chrome V8, пока Google не исправит это.
Отключить: В меню нажмите «Выполнить»> «Отключить новую среду выполнения сценариев приложений на базе Chrome V8».
См. мой пост № 297 на issuetracker.google.com/issues/175141974, и несколько человек подтвердили там, что отключение V8 помогло им. Если у вас это не работает, вам нужно подождать, пока Google не исправит это.
@IrfanAlam Через несколько часов деактивация версии V8 заставила ее снова работать, когда я прокомментировал, что у нее все еще нет положительного отзыва, я удалю свой старый комментарий.
У меня была такая же ситуация. В то время я мог заметить, что когда встроенная функция Google Spreadsheet используется для URL-адреса, значения могут быть получены. В этом случае в качестве текущего обходного пути я использовал следующий поток.
=IMPORTDATA(URL)
.Когда приведенный выше поток отражается на ваш URL-адрес http://www.myurl.com/data/myfile.csv
, он становится следующим.
Когда я увидел ваш скрипт, я подтвердил, что вы используете базовую авторизацию. В этом случае имя пользователя и пароль можно использовать для URL-адреса, например http://username:[email protected]/data/myfile.csv
.
Из вашего скрипта, когда значения username
и password
равны myusername
и mypassword
соответственно, вы можете использовать URL-адрес как http://myusername:[email protected]/data/myfile.csv
.
Здесь есть важный момент. Если определенные символы включены в username
и password
, закодируйте для них URL.
function myFunction() {
const url = "http://myusername:[email protected]/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.info(values)
}
values
. Если вы хотите оставить только значения без формулы, я думаю, что вы можете скопировать и вставить значения.IMPORTDATA
. Но для каждой ситуации могут подойти и другие функции. В этом случае проверьте их.Согласно #346 из официального трекера ошибок https://issuetracker.google.com/issues/175141974
Привет, ребята, я нашел возможное решение, которое работает для меня, попробуйте ввод пустого {} вот так
UrlFetchApp.fetch(apiLink, {});
это сработало для меня
Я попробовал это, и это тоже работает для меня. Работает даже при использовании «новой среды выполнения скриптов приложений на базе Chrome V8».
Чтобы добавить базовую аутентификацию или любую другую аутентификацию, необходима часть опций, и опустошение ее не поможет многим.
У меня такая же проблема, но конкретно с файлами CSV. Это также не случайно, для меня это постоянно с 05:16 UTC сегодня.