GASでgoogleトレンドのRSSを取得しスプレッドシートに保存

# この記事でやること

googleトレンドの情報を長期にわたって保存したいなあと思っていたんですがapiないしなあと困っていたところRSSはあったのでこれで毎日取得して保存していくことに。１年間とかの長期で検索のトレンドを追えるようにする

# 仕様

- RSSを毎日取得
    - 定期実行はスケジュールで
- googleスプレッドシートに保存

# googleの例文解読

```javascript
// Log the title and labels for the first page of blog posts on the G Suite Developers blog.
function parseXml() {
  var url = 'https://gsuite-developers.googleblog.com/atom.xml';
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');

  var entries = root.getChildren('entry', atom);
  for (var i = 0; i < entries.length; i++) {
    var title = entries[i].getChild('title', atom).getText();
    var categoryElements = entries[i].getChildren('category', atom);
    var labels = [];
    for (var j = 0; j < categoryElements.length; j++) {
      labels.push(categoryElements[j].getAttribute('term').getValue());
    }
    Logger.log('%s (%s)', title, labels.join(', '));
  }
}
```
https://developers.google.com/apps-script/reference/xml-service/xml-service#createcommenttext

- UrlFetchApp.fetch()これでurlの中身を取りにいっている。
- getContentTextはUrlFetchApp.fetch()で帰ってきたもののstring(ここではxml）を取得する
- getRootElementで全体のnodeを指定し、getChildrenでその中のentrynodeを指定している
- namespaceで指定されている場合はnamespaceを設定しないといけない。（ https://www.terakoya.work/gas-spreadsheet-get-xml-part1/ ）

# RSSの取得

## googletrendRSSの仕様

https://trends.google.co.jp/trends/trendingsearches/daily/rss?geo=JP

- atom
- xmlns:ht="https://trends.google.co.jp/trends/trendingsearches/dailyとあるのでhtのnamespaceを設定（ https://www.terakoya.work/gas-spreadsheet-get-xml-part1/ ）

## 実際に取得するコードを書いてみた

```javascript
  // url設定
  
  var url = 'https://trends.google.co.jp/trends/trendingsearches/daily/rss?geo=JP';
  
  // namespace設定
  
  var namespace = XmlService.getNamespace("ht",'https://trends.google.co.jp/trends/trendingsearches/daily');
  
  // rss取得
  
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var channel = root.getChild("channel");
  var items = channel.getChildren("item");
```
- urlからUrlFetchApp.fetch(url).getContentText()でxmlを取得
- XmlService.parseでparseする
- document.getRootElement();でrootからごっそり取ってくる
- root.getChild("channel");今回channelは一つなのでchildで複数ならchildren
- var items = channel.getChildren("item")は複数なので配列

# titleなどの取得

上記でitemごとに配列で取得できている状態なので各itemの配列からtitleなどを取っていく

```javascript
    var title = items[i].getChildText("title");
    var traffic = items[i].getChildText("approx_traffic",namespace);
```

# googleスプレッドシートへの保存

```javascript
  // sheetに記入
  
  var sheet = SpreadsheetApp.getActiveSheet();
  var length = items.length;
  var today = new Date();
  var Month = today.getMonth() + 1;
  
  for(var i = 0; i < length; i++) {

    var lastRow = sheet.getLastRow();  
    var title = items[i].getChildText("title");
    var traffic = items[i].getChildText("approx_traffic",namespace);
    
    // 1記事のみ取得なのでgetChild
    
    var news_title = items[i].getChild("news_item",namespace).getChildText("news_item_title",namespace);
    var news_link = items[i].getChild("news_item",namespace).getChildText("news_item_url",namespace);
    
    sheet.getRange(lastRow+1, 1).setValue(today.getFullYear() + "/" +  Month + "/"+ today.getDate()+ "/" + today.getHours() + ":00");
    sheet.getRange(lastRow+1, 2).setValue(title);
    sheet.getRange(lastRow+1, 3).setValue(traffic);
    sheet.getRange(lastRow+1, 4).setValue(news_title);
    sheet.getRange(lastRow+1, 5).setValue(news_link);
  }
```

- sheetを定義する
- lastRowを取得し、for文で回すたびに一番下のrowを取ってきてその一つ下に追記していく

# 全体図

```javascript
function getgoogletrend() {
  
  // url設定
  
  var url = 'https://trends.google.co.jp/trends/trendingsearches/daily/rss?geo=JP';
  
  // namespace設定
  
  var namespace = XmlService.getNamespace("ht",'https://trends.google.co.jp/trends/trendingsearches/daily');
  
  // rss取得
  
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var channel = root.getChild("channel");
  var items = channel.getChildren("item");
  
  // sheetに記入
  
  var sheet = SpreadsheetApp.getActiveSheet();
  var length = items.length;
  var today = new Date();
  var Month = today.getMonth() + 1;
  
  for(var i = 0; i < length; i++) {

    var lastRow = sheet.getLastRow();  
    var title = items[i].getChildText("title");
    var traffic = items[i].getChildText("approx_traffic",namespace);
    
    // 1記事のみ取得なのでgetChild
    
    var news_title = items[i].getChild("news_item",namespace).getChildText("news_item_title",namespace);
    var news_link = items[i].getChild("news_item",namespace).getChildText("news_item_url",namespace);
    
    sheet.getRange(lastRow+1, 1).setValue(today.getFullYear() + "/" +  Month + "/"+ today.getDate()+ "/" + today.getHours() + ":00");
    sheet.getRange(lastRow+1, 2).setValue(title);
    sheet.getRange(lastRow+1, 3).setValue(traffic);
    sheet.getRange(lastRow+1, 4).setValue(news_title);
    sheet.getRange(lastRow+1, 5).setValue(news_link);
  }
}


```