Скрипты Google: как отловить ошибку выполнения в методе XMLService getAttribute () - PullRequest
0 голосов
/ 10 апреля 2020

Я использую этот раздел скрипта Google на листе Google, чтобы проанализировать таблицу на веб-странице и сохранить результаты:

    var doc = XmlService.parse(result);
    var html = doc.getRootElement();
    var resulttable = getElementsByClassName(html, 'resulttable')[0];

    var descendants = html.getDescendants();
    descendants.push(html);  
    for(var i in descendants) {
      var elt = descendants[i].asElement();  <== it crashes
      if(elt != null) {
        var test = elt.getAttributes();
        var test_bis = elt.getAttribute('http-equiv');   <== it does not crashes: 'http-equiv' exists
        var classes = elt.getAttribute('class');   <== it crashes:'class' does not exists
      }
    }

, поскольку показано, что у меня есть некоторые ошибки (просто выдается как " ошибки сервера ") в отмеченных строках этого кода. Я также поставил блоки try-catch, но они не улавливают ошибки: сценарий внезапно завершается. Как я могу перехватить ошибки, чтобы скрипт продолжал работать, несмотря на некоторые эти xml ошибки? Я ожидал, что неопределенные элементы будут иметь место, когда методы asElement () или getAttribute () не пройдут.

Заранее спасибо.

PS Я отредактировал вопрос, добавив происхождение страницы html, как требуется в комментарии. Для анализа URL я использовал этот подход

  var url = "https://albopretorio.comune.gravina.ba.it/fo/?ente=GravinaInPuglia";
  var today = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy");

  var payload =
      {
        "tipoSubmit":"ricerca",
        "enti":"GravinaInPuglia",
        "uo":"",
        "tipoatto":"",
        "anno":"",
        "numda":"",
        "numa":"",
        "annoatto":"",
        "numatto":"",
        "datada":"",
        "dataa":"",
        "pubblicatoda":today,
        "pubblicatoa":"",
        "presenteal":"",
        "chiave":"",
        "provenienza":"",
      };

  var options =
      {
        "method"  : "POST",
        "payload" : payload,   
        "followRedirects" : true,
        "muteHttpExceptions": true
      };
var result = UrlFetchApp.fetch(url, options);

1 Ответ

1 голос
/ 10 апреля 2020

Проблема:

Вы не знаете, какой ContentType каждый descendant, поэтому вы не знаете, какой метод следует использовать для приведения узла.

Решение:

Для каждого descendant проверьте соответствующий ContentType с помощью метода getType () . Вы можете использовать возвращаемое значение (ContentType) и оператор switch , чтобы использовать тот или иной метод.

Фрагмент кода:

for (var i in descendants) {
  var contentType = descendants[i].getType();
  var elt;
  switch (contentType.toString()) {
    case 'TEXT':
      elt = descendants[i].asText();
      break;
    case 'ELEMENT':
      elt = descedants[i].asElement();
      break;
    // Add other possible ContentTypes, if necessary

Обновление: выпуск с getAttribute:

Во избежание попытки сценария получить атрибут, который не существует, вы можете получить массив имен атрибутов для этого элемента, а затем проверить, включен ли ваш атрибут в этот массив:

var attributes = elt.getAttributes().map(attribute => attribute.getName());
if (attributes.includes('class')) {
  var classes = elt.getAttribute('class');
}

Ссылка:

...