Ошибка «Сервер не поддерживает функциональность, необходимую для выполнения этого запроса» при импорте CSV с базовой аутентификацией - PullRequest
0 голосов
/ 23 сентября 2019

Я искал метод, который может импортировать CSV в лист Google с базовой аутентификацией.Пока что все решения онлайн устарели.

Я следовал методу, найденному здесь: https://gist.github.com/jmodjeska/b0af2372c75c903700aeca4afb1fd56f

Который в основном делает это:

    // Helper function: generate a random number for a cache busting token 
function cacheBust() {
  return Math.floor((Math.random() * 100000) + 1);
}

// Helper function: parse the CSV response
function parseCsvResponse(csvString, ignoreHeaders) {
  var retArray = [];
  var strLines = csvString.split(/\n/g);
  startLine = ignoreHeaders ? 1 : 0;
  for (var i = startLine; i < strLines.length; i++) {
    var line = strLines[i];
    if (line != '') {
      retArray.push(line.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/));
    }
  }
  return retArray;
}

// Main function: retrieve the CSV and poppulate the data in-place
function populateSheetWithCSV(foo, csvUrl, base64pw, ignoreHeaders, bustCache) {
  var url = cacheBust ? csvUrl .concat(cacheBust()) : csvUrl;
   var resp = UrlFetchApp.fetch(url, { headers: {'Authorization': 'Basic '.concat(base64pw) }, muteHttpExceptions:true});
  var csvContent = parseCsvResponse(resp.getContentText(), ignoreHeaders);
  return csvContent;  
}

Затем я вызываю метод, отбрасывая его в ячейку A1:

=populateSheetWithCSV("Any Value", "https://csv-url", "base64pw", TRUE, TRUE)

Ошибка, которую я получаю в электронной таблице при вставке формулы: The server does not support the functionality needed to fulfill this request.</u></p><hr class="line"><h3>Apache Tomcat/8.5.11

Обновление 2: в комментарии пользователя я пытаюсь жестко закодировать имя пользователя, пароль и URL-адрес в фактическомМетод populateSheetWithCSV (первая часть кода остается неизменной):

    // Main function: retrieve the CSV and poppulate the data in-place
function populateSheetWithCSV(foo, ignoreHeaders) {
  var USERNAME = PropertiesService.getScriptProperties().getProperty('test');
  var PASSWORD = PropertiesService.getScriptProperties().getProperty('test');
 var url = PropertiesService.getScriptProperties().getProperty('https://csv-url-redacted');///////
  var headers = {
    "Authorization" : "Basic " + Utilities.base64Encode(USERNAME + ':' + PASSWORD)
  };

  var params = {
    "method":"GET",
    "headers":headers
  };
  var resp = UrlFetchApp.fetch(url, params);
  var csvContent = parseCsvResponse(resp.getContentText(), ignoreHeaders);
  return csvContent;  

}

Я получаю сообщение об ошибке: Attribute provided with no value: url (line 33)., используя этот второй метод.Строка 33 - это "var resp = ..."

1 Ответ

0 голосов
/ 24 сентября 2019

Попробуйте следующий код:

function populateSheetWithCSV(foo, ignoreHeaders) {
  var USERNAME = 'YOURUSERNAME';
  var PASSWORD = 'YOURPASSWORD';
 var url = 'https://csv-url-redacted';
  var headers = {
    "Authorization" : "Basic " + Utilities.base64Encode(USERNAME + ':' + PASSWORD)
  };

  var params = {
    "method":"GET",
    "headers":headers
  };
  var resp = UrlFetchApp.fetch(url, params);
  var csvContent = parseCsvResponse(resp.getContentText(), ignoreHeaders);
  return csvContent;  

}

Аннотация: Если вы хотите использовать Свойства сценария как здесь , имейте в виду, что свойства сценарияявляются парами ключ-значение, и вы должны установить значение, прежде чем сможете его получить.

Пример:

PropertiesService.getScriptProperties().setProperty('URL', 'https://csv-url-redacted');
...
var url = PropertiesService.getScriptProperties().getProperty('URL');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...