在时间触发器上调用单元格中的内置函数(Google Spreadsheets Script)?

时间:2018-09-18 21:41:46

标签: javascript google-apps-script google-sheets

我将Google表格用作“中间人”,以从RSS Feed中获取并保存值。使用= ImportFeed,当打开工作表时,来自RSS feed的值将在工作表中更新。这会将值插入到单元格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 Trigger方法调用上述函数。

1 个答案:

答案 0 :(得分:1)

  • 您想使用Google Apps脚本实现=IMPORTFEED("https://www.nasa.gov/rss/dyn/breaking_news.rss", "items" , FALSE, 1)
  • 您要将检索到的值放在活动电子表格中的工作表上。

如果我对您的问题的理解是正确的,那么该修改如何?

修改点:

  • Google Apps脚本中没有ImportFeed()方法。
    • 为了实现=IMPORTFEED(),我使用了以下流程。
      1. 使用https://www.nasa.gov/rss/dyn/breaking_news.rssUrlFetchApp.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()。 / li>

参考文献:

如果我误解了您的问题,请告诉我。我想修改它。