Разбор XML в Google Scripts на листе Google - PullRequest
0 голосов
/ 01 мая 2018

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

Используя информацию по этому вопросу: Cheers MogsDad

Я могу успешно получить внешний файл XML и данные отображаются в логгере.

Я не могу за всю жизнь написать какую-либо информацию или элементы в мою таблицу. В общей ссылке @mogsdad ссылается на XML-сайт для анализа. К сожалению ссылка мертва. Текущий код возвращает файл XML. Обычно я бы попытался использовать формулу importxml, но мне не повезло. Убрал мои попытки написания кода для анализа XML, чтобы код не выглядел ужасно

есть ли у кого-нибудь указания о том, как проанализировать некоторые файлы, или узнать рабочий URL-адрес документа XML для разбора?

Вот мой код. Заранее спасибо

    function importFromXml(){
  var url = 'URL HERE'; // Advance search for macs not encrypted.
  var username = 'USER HERE';
  var password = 'PASSWORD HERE';

  var headers =
  {
    Authorization : "Basic " + Utilities.base64Encode(username+':'+password)
  }

  var options =
  {
    "method" : "get",
    "headers": headers
  };

   var headers =
  {
    Authorization : "Basic " + Utilities.base64Encode(username+':'+password)
  }

  var options =
  {
    "method" : "get",
    "headers": headers
  };

  // Getting "bad request" here - check the username & password
  var result = UrlFetchApp.fetch(url, options);
  var state=result.getContentText(); 

  // You should check state.getResponseCode()

  Logger.log('1: '+state);
  Logger.log(parse(state));
}

function parse(txt) {
  var doc = Xml.parse(txt, true);
  return doc;                            // Return results
}

**** РЕДАКТИРОВАТЬ ****

После еще большей игры у меня есть некоторый прогресс.

    var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("NoFirevault");
var range = ss.getRange(1, 1);

range.setValue(state);

Мне удалось записать содержимое XML на мой лист. Хотя и в одной камере. Когда я пытаюсь разбить данные на ячейки, использую длину данных и использую setValues. Это задевает меня, будет продолжать играть.

**** РЕДАКТИРОВАТЬ *****

После еще большей игры. Я могу получить данные XML, записанные на листе. Там 31 записей, с различными атрибутами. Но все они записываются в одну ячейку для каждой записи.

Что является улучшением для ВСЕХ 31 записей, идущих в одну ячейку.

В случае, если это поможет, вот разметка XML, на которую я смотрю. Я хочу данные компьютера, в разделе компьютеров.

XML Structure

function importFromJamf(){
  var url = 'URL HERE'; // Advance search for macs not encrypted.
  var username = 'USER HERE';
  var password = 'Password';

  var headers =
  {
    Authorization : "Basic " + Utilities.base64Encode(username+':'+password)
  }

  var options =
  {
    "method" : "get",
    "headers": headers
  };

   var headers =
  {
    Authorization : "Basic " + Utilities.base64Encode(username+':'+password)
  }

  var options =
  {
    "method" : "get",
    "headers": headers
  };


  var result = UrlFetchApp.fetch(url, options);
  var state = result.getContentText(); 



var document = XmlService.parse(state);





 var entries = document.getRootElement().getChild('computers').getChildren(); // Working but values joined into one row




for (i=0;i<entries.length;i++){



var value = entries[i].getValue();


SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2").getRange(i+1,1).setValue(value);

}





}

1 Ответ

0 голосов
/ 23 мая 2018
function importFromJamf(){
  var url = 'url'; 
  var username = 'user';
  var password = 'pw';

  var headers =
  {
    Authorization : "Basic " + Utilities.base64Encode(username+':'+password)
  }

  var options =
  {
    "method" : "get",
    "headers": headers
  };




  var result = UrlFetchApp.fetch(url, options);
  var state = result.getContentText(); 



   var document = XmlService.parse(state);



var array= [];




  var entries = document.getRootElement().getChild('computers').getChildren('computer');


  for(i = 0 ; i < entries.length ; i++){


var a = entries[i].getContent(5).getValue();
var b = entries[i].getContent(8).getValue();
var c = entries[i].getContent(9).getValue();
var d = entries[i].getContent(6).getValue();
var e = entries[i].getContent(11).getValue();
var f = entries[i].getContent(12).getValue();
var g = entries[i].getContent(10).getValue();

var data = [a,b, c,d,e, f,g];
array.push(data);

  }

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Sheet1");
  sheet.getRange("A2:Z").clearContent();
  var range = sheet.getRange(2,1,array.length, array[0].length);
  range.setValues(array);
}

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

.getContent () помог мне получить значения y столбцов массива в каждом цикле

Но я уверен, что есть лучшие способы сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...