Импорт XML с Google Sheet и автоматическим обновлением sh каждую минуту - PullRequest
0 голосов
/ 13 марта 2020

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

  • Триггер, кажется, работает нормально, как я вижу, последнее время выполнения обновляется каждую минуту.
  • Сценарий, вызывающий данные XML, работает нормально, так как я вижу, как данные заполняются в электронной таблице.
  • Фид XML тоже работает нормально, так как я можно видеть время, которое обновляется каждую минуту, также есть задание cron.
  • У меня есть только эта функция в качестве проекта.

    function getData() {
      var sheetName = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("prices");
      var queryString = Math.random();
      var cellFunction = '=ImportXML("http://myxmldata.com/data-xml.php","//data/date")';
      sheetName.getRange('A2').setValue(cellFunction);
    } 
    

    Так что же не так?

1 Ответ

0 голосов
/ 16 марта 2020

Вот как я решил свою проблему:

В вашей электронной таблице go в верхнем меню> щелкните «Инструмент»> затем «Редактор сценариев» и добавьте следующие сценарии:

Это сценарий позвонить ваши данные, например, XML. Пожалуйста, обновите скрипт своей собственной информацией. YOUR-SHEET-NAME, название вкладки, например, "цены".

function getData() {
  var sheetName = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("YOUR- 
  SHEET-NAME");
  var queryString = Math.random();
  var cellFunction = '=ImportXML("https://yoururl-xml.php","//trade/price")';  

  var range = sheetName.getRange('A2');

  range.clearContent();  // You can also use range.setFormula("");
  SpreadsheetApp.flush();
  range.setFormula(cellFunction);
  }

Под этим сценарием добавьте следующий сценарий, дополнительную информацию на этой странице: Периодически обновлять sh ИМПОРТ XML () функция электронной таблицы

ВАША -SHEET-ID - это длинное число в URL таблицы, например, 1YTB12xSTMSNdoT_S1U67MtOUDTf6n4OL2tJLnTNAXYZ

function RefreshImports() {
  var lock = LockService.getScriptLock();
  if (!lock.tryLock(5000)) return;             // Wait up to 5s for previous refresh to end.

  var id = "YOUR-SHEET-ID";
  var ss = SpreadsheetApp.openById(id);
  var sheet = ss.getSheetByName("YOUR-SHEET-NAME");
  var dataRange = sheet.getDataRange();
  var formulas = dataRange.getFormulas();
  var content = "";
  var now = new Date();
  var time = now.getTime();
  var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;
  var re2 = /((\?|&)(update=[0-9]*))/gi;
  var re3 = /(",)/gi;

  for (var row=0; row<formulas.length; row++) {
    for (var col=0; col<formulas[0].length; col++) {
      content = formulas[row][col];
      if (content != "") {
        var match = content.search(re);
        if (match !== -1 ) {
          // import function is used in this cell
          var updatedContent = content.toString().replace(re2,"$2update=" + time);
          if (updatedContent == content) {
            // No querystring exists yet in url
            updatedContent = content.toString().replace(re3,"?update=" + time + "$1");
          }
          // Update url in formula with querystring param
          sheet.getRange(row+1, col+1).setFormula(updatedContent);
        }
      }
    }
  }

  // Done refresh; release the lock.
  lock.releaseLock();

}

Вот снимок экрана обоих сценариев:

enter image description here

1021 * Затем добавьте таймер, go, в верхнее меню нажмите на часы и добавьте триггер. Убедитесь, что вы выбрали правильную функцию, т.е. RefreshImports.

enter image description here

enter image description here

Готово!

...