Непредвиденная ошибка в UrlFetchApp.fetch в скрипте Google Apps с использованием обычной аутентификации

У меня есть следующий код в скрипте 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")

Я пытался:

  • Размещение учетных данных непосредственно в URL-адресе, а не в заголовке авторизации (я получил другую ошибку, говорящую «Информация для входа запрещена»).
  • Кодирование учетных данных в base64 сразу, когда я передаю их в объект заголовков (не сработало, та же ошибка).
  • Полное удаление аутентификации (как и ожидалось, я получил ответ 401 с HTTP-страницы).

Я не уверен, что еще попробовать и почему это внезапно сломалось. Любой совет?

У меня такая же проблема, но конкретно с файлами CSV. Это также не случайно, для меня это постоянно с 05:16 UTC сегодня.

Ploni 10.12.2020 18:22

Кроме того, вы можете разделить var csvContent = UrlFetchApp.fetch(url, options).getContentText(); на две строки для целей отладки, хотя у меня это уже есть, и оно падает при вызове fetch(), поэтому в этом случае особо нечего собирать.

Ploni 10.12.2020 18:24

У меня такая же проблема со сценарием, который использует UrlFetchApp рано утром для получения некоторой информации об акциях из источника данных. Работает безупречно в течение нескольких месяцев, и вдруг 7 декабря начала появляться «неожиданная ошибка», указывающая на эту строку. Я могу подтвердить, что когда я использовал тот же точный URL-адрес для ручной выборки с помощью importhtml, я получаю данные. Что-то изменилось со стороны Google... но что? Итак, оказывается, это проблема Google, которая затрагивает многих людей. По крайней мере, мы не одиноки...

MountainCat 10.12.2020 23:36

@Ploni Я забыл упомянуть в посте, но я действительно разделил эти строки во время отладки, чтобы увидеть, есть ли какие-либо проблемы, но проблема действительно с fetch(). Похоже, это проблема Google, будем надеяться, что она скоро будет исправлена.

Step 11.12.2020 10:00

Я рекомендую всем "пометить" проблему, см. ссылку в ответе @ziganotschka.

Peter Thoeny 12.12.2020 02:13

Хотя, к сожалению, я не могу проверить ваш URL-адрес, в качестве ответа я предложил текущий обходной путь. Не могли бы вы подтвердить это? Если это не было полезно для вашей ситуации, я извиняюсь.

Tanaike 14.12.2020 12:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
12
6
2 614
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Это связано с новой ошибкой, смотрите здесь

Затронуты многие пользователи, я рекомендую вам пометить проблему звездочкой, чтобы повысить ее заметность и, надеюсь, ускорить процесс.

Согласно # 346 из официального трекера проблем issuetracker.google.com/issues/175141974 эй, ребята, я нашел возможное решение, которое работает для меня, попробуйте ввести пустой {}, например, UrlFetchApp.fetch(apiLink, {}) ; это сработало для меня, я попробовал это, и это тоже работает для меня. Работает даже при использовании «новой среды выполнения скриптов приложений на базе Chrome V8».

BaconCatBug 15.12.2020 14:35

Помечено Исправлено. #377

TheMaster 16.12.2020 16:09

Отключите механизм выполнения Chrome V8, пока Google не исправит это.

Отключить: В меню нажмите «Выполнить»> «Отключить новую среду выполнения сценариев приложений на базе Chrome V8».

См. мой пост № 297 на issuetracker.google.com/issues/175141974, и несколько человек подтвердили там, что отключение V8 помогло им. Если у вас это не работает, вам нужно подождать, пока Google не исправит это.

Irfan Alam 15.12.2020 08:02

@IrfanAlam Через несколько часов деактивация версии V8 заставила ее снова работать, когда я прокомментировал, что у нее все еще нет положительного отзыва, я удалю свой старый комментарий.

Digital Farmer 15.12.2020 23:52

У меня была такая же ситуация. В то время я мог заметить, что когда встроенная функция Google Spreadsheet используется для URL-адреса, значения могут быть получены. В этом случае в качестве текущего обходного пути я использовал следующий поток.

  1. Напишите формулу =IMPORTDATA(URL).
  2. Получить значения с листа.

Когда приведенный выше поток отражается на ваш URL-адрес http://www.myurl.com/data/myfile.csv, он становится следующим.

О базовой авторизации для URL:

Когда я увидел ваш скрипт, я подтвердил, что вы используете базовую авторизацию. В этом случае имя пользователя и пароль можно использовать для 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)
}
  • Когда вышеприведенный скрипт запускается, значения из URL-адреса помещаются на лист, а значения извлекаются в виде двумерного массива для values. Если вы хотите оставить только значения без формулы, я думаю, что вы можете скопировать и вставить значения.
  • В этом ответе я использовал IMPORTDATA. Но для каждой ситуации могут подойти и другие функции. В этом случае проверьте их.

Примечание:

  • Это текущий обходной путь. Поэтому, когда эта проблема была устранена, я думаю, что вы можете использовать свой оригинальный сценарий.

Использованная литература:

Согласно #346 из официального трекера ошибок https://issuetracker.google.com/issues/175141974

Привет, ребята, я нашел возможное решение, которое работает для меня, попробуйте ввод пустого {} вот так

UrlFetchApp.fetch(apiLink, {});

это сработало для меня

Я попробовал это, и это тоже работает для меня. Работает даже при использовании «новой среды выполнения скриптов приложений на базе Chrome V8».

Чтобы добавить базовую аутентификацию или любую другую аутентификацию, необходима часть опций, и опустошение ее не поможет многим.

TheMaster 15.12.2020 14:39

Другие вопросы по теме