Вызов встроенной функции в ячейке по триггеру времени (Google Spreadsheets Script)? - PullRequest
0 голосов
/ 19 сентября 2018

Я использую Google Sheets в качестве посредника для получения и хранения значений из RSS-канала.Используя = ImportFeed, когда лист открыт, значения из ленты RSS обновляются на листе.Это вставит значения в ячейки A1: E1.

sheet1, cell A1 contains:
=ImportFeed("http://lorem-rss.herokuapp.com/feed", "items" , FALSE, 1)

Но в моей настройке пользователь не будет активно открывать лист.Скорее мне нужна эта функция для запуска по таймеру, например, каждый час.Я попробовал следующее в редакторе сценариев листа, но, конечно, он не запустится.

function fetchRSS() {
  var response = 
    ImportFeed("https://www.nasa.gov/rss/dyn/breaking_news.rss", "items" , FALSE, 1);
    var sheet = SpreadsheetApp.getActiveSheet();
    sheet.getRange(1,1).setValue([response]);
}

В идеале вышеупомянутая функция может вызываться с помощью EveryHours (n) или с помощью метода триггера UI.

1 Ответ

0 голосов
/ 19 сентября 2018
  • Вы хотите достичь =IMPORTFEED("https://www.nasa.gov/rss/dyn/breaking_news.rss", "items" , FALSE, 1) с помощью Google Apps Script.
  • Вы хотите поместить полученные значения на лист в активной электронной таблице.

Если мойпонимание вашего вопроса является правильным, как насчет этой модификации?

Точки модификации:

  • В скрипте Google Apps нет метода ImportFeed().
    • Чтобы достичь =IMPORTFEED(), я использовал следующий поток.
      1. Извлечение значений из https://www.nasa.gov/rss/dyn/breaking_news.rss с использованием UrlFetchApp.fetch().
      2. Анализ полученных значений с использованием XmlService.parse().
      3. Помещение значений в электронную таблицу.

Модифицированный скрипт:

Когда вы используете этот скрипт, пожалуйста, скопируйте и вставьте следующий скрипт в ваш редактор скриптов и запустите fetchRSS().

// In the case of this function, if "n" is 1, the 1st item is retrieved.
function ImportFeed(url, n) {
  var res = UrlFetchApp.fetch(url).getContentText();
  var xml = XmlService.parse(res);
  var item = xml.getRootElement().getChild("channel").getChildren("item")[n - 1].getChildren();
  var values = item.reduce(function(obj, e) {
    obj[e.getName()] = e.getValue();
    return obj;
  }, {});
  return [[values.title, values.link, values.pubDate, values.description]];
}

// Please run this function.
function fetchRSS() {
  var response = ImportFeed("https://www.nasa.gov/rss/dyn/breaking_news.rss", 1);
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(sheet.getLastRow() + 1, 1, response.length, response[0].length).setValues(response);
}

Примечание:

  • Этот сценарий предполагает, что вы используете связанный с контейнером сценарий Spreadsheet.
  • Когда вы запускаете fetchRSS(), используя триггер времени,значения записываются в последнюю строку первого листа таблицы.Если вы хотите поместить значения на конкретный лист в электронной таблице, измените значение с var sheet = SpreadsheetApp.getActiveSheet() на var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name).
  • В этом измененном сценарии, если вы хотите использовать другой URL, при структуре xmlи имена дочернего элемента-узла отличаются от https://www.nasa.gov/rss/dyn/breaking_news.rss, требуется изменить ImportFeed().

Ссылки:

Если я неправильно понимаю ваш вопрос, скажи пожалуйста.Я хотел бы изменить его.

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