Google Apps Script(GAS)でJ-STAGE APIから最新の論文情報を取得し、毎日チャットするBot
こんにちは。
今回の記事はすべてClaude3-Opusで作成しました。ご了承ください。
今回は、Google Apps Script(GAS)とJ-STAGE APIを使って、指定したキーワードに関する最新の論文情報を自動的に取得し、Googleスプレッドシートに保存する方法をご紹介します。
J-STAGE APIとは
J-STAGE APIは、科学技術振興機構(JST)が運営する学術情報プラットフォーム「J-STAGE」に登録されている論文情報を取得するためのWebAPIです。このAPIを使うことで、J-STAGEに登録されている膨大な論文情報を、プログラムから自動的に取得することができます。
Google Apps Script(GAS)とは
Google Apps Script(GAS)は、Googleが提供するサーバーサイドのJavaScriptプラットフォームです。GASを使うことで、Google SpreadsheetやGoogle Docsなどの各種Googleサービスを連携し、自動化することができます。
コードの紹介
function searchAndSaveArticles {
// API リクエストのベースURL
const baseUrl = "https://api.jstage.jst.go.jp/searchapi/do?";
// 昨日の年を取得
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const yesterdayStr = Utilities.formatDate(yesterday, "JST", "yyyy");
// API リクエストのパラメータ
const params = {
service: 3,
text: encodeURIComponent("発達障害"), // 全文
// keyword: encodeURIComponent("発達障害"), // キーワード
// article : encodeURIComponent("発達障害"), // 論文タイトル
// abst : encodeURIComponent("発達障害"), // 抄録
// material : encodeURIComponent("発達障害"), // 資料名
pubyearfrom: yesterdayStr,
pubyearto: yesterdayStr,
// count: 100, // 最大1000まで。
};
// API リクエストのURL
const url = baseUrl + Object.entries(params).map(([key, value]) => `${key}=${value}`).join("&");
// API リクエストを送信
const response = UrlFetchApp.fetch(url);
const xml = response.getContentText();
// XML をパースして論文情報を取得
const document = XmlService.parse(xml);
const root = document.getRootElement();
// ルート要素の情報を出力
const entries = root.getChildren("entry", root.getNamespace());
// エントリー数を出力
console.log("Number of entries: " + entries.length);
// 各エントリーの情報を出力
for (let i = 0; i < entries.length; i++) {
console.log("Entry " + (i + 1) + ":");
console.log(entries[i].toString());
}
// 論文情報を格納する配列
const articles = [];
let jstage = "最新の論文です" + "\n\n";
// スプレッドシートからIDの一覧を取得
const sheet = SpreadsheetApp.getActiveSheet();
const lastRow = sheet.getLastRow();
const idRange = sheet.getRange(1, 1, lastRow);
const idValues = idRange.getValues().flat();
// 各論文の情報を取得
for (const entry of entries) {
const idElement = entry.getChild("id", root.getNamespace());
const titleElement = entry.getChild("article_title", root.getNamespace());
const updatedElement = entry.getChild("updated", root.getNamespace());
const urlElement = entry.getChild("article_link", root.getNamespace());
// 要素が存在する場合にのみ処理を行う
if (idElement && titleElement && updatedElement && urlElement) {
const id = idElement.getText();
const title = titleElement.getChild("ja", root.getNamespace()).getText();
const updated = updatedElement.getText();
const url = urlElement.getChild("ja", root.getNamespace()).getText();
// スプレッドシートにまだ存在しないIDの場合のみ追加
if (!idValues.includes(id)) {
articles.push([id, title, updated, url]);
jstage += title + "\n" + url + "\n\n";
}
}
}
// スプレッドシートに論文情報を保存
if (articles.length > 0) {
sheet.getRange(lastRow + 1, 1, articles.length, articles[0].length).setValues(articles);
// チャットに送信
sendChattext(jstage)
}
}
function sendChattext(text){
// 送信用webhook
let webhook = ""; // ここにwebhookのURLを記載;
// chatに送信
let message = {
'text': text,
}
let options = {
'method': 'POST',
'headers': {
'Content-Type': 'application/json; charset=UTF-8'
},
'payload': JSON.stringify(message)
};
let response = UrlFetchApp.fetch(webhook, options); //送信処理
console.log(response);
}
コードの説明
今回紹介するコードは、以下の処理を行います。
J-STAGE APIに、指定したキーワード(今回は「発達障害」)で論文を検索するリクエストを送信します。
APIから返却されたXMLデータをパースし、各論文の情報(ID、タイトル、更新日、URL)を取得します。
取得した論文情報のうち、Googleスプレッドシートにまだ存在しないものだけを新たに追加します。
追加した論文情報を、指定したチャットに通知します。
コードの中で、J-STAGE APIへのリクエストパラメータを設定する部分があります。ここでは、検索対象を「全文」としていますが、「キーワード」「論文タイトル」「抄録」「資料名」など、必要に応じて変更することができます。
また、取得した論文情報をGoogleスプレッドシートに保存する際、すでにスプレッドシートに存在するIDの論文は除外するようにしています。これにより、重複なく新しい論文情報だけを追加できます。
まとめ
以上、Google Apps Script(GAS)とJ-STAGE APIを使って、最新の論文情報を自動取得する方法をご紹介しました。このコードを活用することで、研究に必要な最新の論文情報を効率的に収集することができるでしょう。
GASのシンプルさとJ-STAGE APIの強力な検索機能を組み合わせることで、研究者の皆さんの情報収集がより一層捗ることを願っています。ぜひ、このコードを参考に、自分だけの論文情報収集ツールを作ってみてください。
資料
J-STAGE WebAPI ご利用マニュアル
https://www.jstage.jst.go.jp/static/files/ja/manual_api.pdf