モチベーション
はてなブログの一覧を Google Sheets で管理したいと欲求が込み上げてきました. 手動で現在投稿した記事を Sheets にコピペして、新しい記事を書くたびに追加する運用も考えましたが、少し面倒そうです. そこで GAS で簡単にできたらいいなと思い作ってみました.
処理の流れ
- スプレッドシート の更新をトリガーにGAS を起動
- GAS がはてなブログ記事一覧を取得(AtomPub を使って、XML形式でデータを取得します)
- GAS でXMLからブログタイトル一覧を取得
- GAS で Sheets 書き込み
作業内容
はてなブログから API key を取得
はてなブログが提供している API を利用するために、はてなブログの設定から API key を取得します. [設定] → [詳細設定] → [AtomPub] から取得できました.
www.kotanin0.work (ほとんどこのサイトを参考にさせていただきました)
Google Sheets を作成
サイト一覧の情報を書き出す Sheets を作成します.
このとき、書き出す先のシートの id とシート名をメモしてください.
GAS のコーティングのときに使用します.
シートのid を Sheets の URL の以下の部分です.
https://docs.google.com/spreadsheets/d/sheet_id
シート名はシートを作成すると下にあるタブの名前です.
Sheets に紐付いた GAS を作成
「ツール」 -> 「スクリプト エディタ」を選択し、GAS を作成します.
GAS でコーディング
メインの関数 1 つ(HatenaListGet)と、部分的な関数 4 で構成してみました.
- XML からブログタイトルを取得する関数 : getTitles
- XML から次の URL を取得する関数 : getNextURL
- API を使って、XML を取得する関数 : getXML
- 取得したブログ一覧を Sheets へ書き込む関数 : setContents
(基本コードをベタばりで動くと思います. 記入箇所を埋めていれば)
function getTitles(xml) { var entries = Parser.data(xml).from('<title>').to('</title>').iterate(); // ブログタイトルを除く var blog_title = entries.shift(); return entries }
function getNextURL(xml) { var url = Parser.data(xml).from('<link rel="next" href="').to('" />').build(); if (url.slice(0,4) != "http"){ var url = "Nothing" } return url }
ここで、はてなのユーザID と API Key を使います.
function getXML(url) { // はてなのユーザID、APIキー const user = 'xxx'; const apiKey = 'xxx'; // リクエストヘッダの準備 const options = { 'method' : 'GET', 'headers' : {'Authorization' : 'Basic ' + Utilities.base64Encode(user + ':' + apiKey)} } // xml形式で返却される var xml = UrlFetchApp.fetch(url, options).getContentText(); return xml }
ここで、sheets id とシート名を使います. sheet の中のどこの部分に書き出すかを変更する場合は、この関数をいじれば変えれます.
function setContents(contentList){ var contentLength = contentList.length; var spreadsheet_id = 'xxx'; var sheet_name = 'xxx'; var spreadsheet = SpreadsheetApp.openById(spreadsheet_id); var sheet = spreadsheet.getSheetByName(sheet_name); var count = 2; contentList.forEach(function(content){ sheet.getRange("A"+String(count)).setValue(content); count += 1; }); }
AtomPub へアクセスするためのURL は以下を参考に作ってください.
https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry
function HatenaListGet() { // ルートエンドポイント var url = 'xxx'; var ended = false; var contentList = []; while (!ended) { var xml = getXML(url) var entries = getTitles(xml); contentList = contentList.concat(entries); url = getNextURL(xml); console.info(url) if (url == "Nothing") { break } } contentList = contentList.reverse(); console.info(contentList) setContents(contentList); }
GAS のトリガーを設定
GAS のトリガーを設定します.
「トリガー」-> 「トリガーを追加」を選択し、関数やソース、イベントの種類を選択します.(ほとんど、デフォルトでいけそうです)