医療DXの現場では、新しい技術・制度・事例の情報収集が常に必要です。ところが、情報は分散していて、毎日手動でチェックするのは現実的ではありません。X(旧Twitter)には医療DX関連の投稿が日々流れていますが、重要な情報を見逃さず拾い続けるのは難しい。
そこでgiverthでは、X API v2 と Google Apps Script(GAS)を組み合わせ、医療DX関連ワードの投稿を自動収集してスプレッドシートに集約するシステムを構築しました。この記事では、その全工程を公開します。
なぜ医療DXのトレンド情報収集をX APIで自動化したか
医療DX分野でコンサルティング・支援を行う上で、以下の情報を常にキャッチアップする必要があります。
- 電子カルテ・医療情報システムの動向
- 診療報酬改定・医療制度の変更情報
- AI・ロボティクスの医療応用事例
- 医療機関のDX推進事例・失敗事例
- 競合他社・有力プレイヤーの動向
これらをXで手動収集していましたが、情報量が多く見逃しも発生していました。また、重要な投稿を後から検索・参照しようとしても埋もれてしまうことが課題でした。
システム構成(X API v2 + GAS + スプレッドシート)
構築したシステムの全体像は以下のとおりです。
トリガー:GAS 時間主導型トリガー(毎朝7:00)
↓
GAS:X API v2 の検索エンドポイントを呼び出す
↓
X API v2(Bearer Token認証):指定クエリで直近24時間の投稿を取得
↓
GAS:レスポンスをパースして重複チェック
↓
Googleスプレッドシート:日付・投稿ID・本文・いいね数・RT数・URL を記録
X API の Free プランでも検索エンドポイント(GET /2/tweets/search/recent)は利用可能ですが、月間読み取り上限があります。日次で少量収集する用途であれば無料枠で十分です。
GASでのX API認証・投稿取得コード
事前準備
- X Developer Portal(
developer.twitter.com)でアプリを作成 - Bearer Token を発行してコピー
- Google スプレッドシートを新規作成してスプレッドシートIDをコピー
- スプレッドシートの「拡張機能」→「Apps Script」でエディタを開く
メインスクリプト
// ===== 設定 =====
const BEARER_TOKEN = 'ここにBearer Tokenを貼り付け';
const SPREADSHEET_ID = 'ここにスプレッドシートIDを貼り付け';
const SHEET_NAME = '医療DXトレンド';
// 収集キーワード(OR検索)
const SEARCH_QUERY = '(医療DX OR 電子カルテ OR 診療報酬AI OR オフラインAI) lang:ja -is:retweet';
const MAX_RESULTS = 100; // 1回あたりの取得件数(10〜100)
// ===== メイン処理 =====
function collectMedicalDxTweets() {
const sheet = getOrCreateSheet();
const existingIds = getExistingTweetIds(sheet);
const tweets = fetchTweets(SEARCH_QUERY, MAX_RESULTS);
if (!tweets || tweets.length === 0) {
console.log('新しい投稿はありませんでした');
return;
}
let newCount = 0;
tweets.forEach(tweet => {
if (existingIds.has(tweet.id)) return; // 重複スキップ
sheet.appendRow([
new Date(),
tweet.id,
tweet.text,
tweet.public_metrics?.like_count ?? 0,
tweet.public_metrics?.retweet_count ?? 0,
tweet.public_metrics?.reply_count ?? 0,
`https://x.com/i/web/status/${tweet.id}`,
tweet.created_at
]);
newCount++;
});
console.log(`${newCount}件の新規投稿を記録しました`);
}
// ===== X API 呼び出し =====
function fetchTweets(query, maxResults) {
const endpoint = 'https://api.twitter.com/2/tweets/search/recent';
const params = {
query: query,
max_results: maxResults,
'tweet.fields': 'created_at,public_metrics,author_id',
start_time: getYesterdayISO() // 直近24時間
};
const url = endpoint + '?' + buildQueryString(params);
const response = UrlFetchApp.fetch(url, {
headers: { 'Authorization': `Bearer ${BEARER_TOKEN}` },
muteHttpExceptions: true
});
if (response.getResponseCode() !== 200) {
console.error('APIエラー:', response.getContentText());
return [];
}
const json = JSON.parse(response.getContentText());
return json.data ?? [];
}
// ===== ユーティリティ =====
function getOrCreateSheet() {
const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
let sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) {
sheet = ss.insertSheet(SHEET_NAME);
sheet.appendRow(['収集日時','ツイートID','本文','いいね','RT','返信','URL','投稿日時']);
}
return sheet;
}
function getExistingTweetIds(sheet) {
const data = sheet.getDataRange().getValues();
return new Set(data.slice(1).map(row => String(row[1])));
}
function getYesterdayISO() {
const d = new Date();
d.setDate(d.getDate() - 1);
return d.toISOString();
}
function buildQueryString(params) {
return Object.entries(params)
.map(([k, v]) => encodeURIComponent(k) + '=' + encodeURIComponent(v))
.join('&');
}
トリガーの設定
GASエディタの「トリガー」メニューから以下を設定します。
collectMedicalDxTweets → 時間主導型 → 午前6〜7時(毎日)
これで毎朝7時頃に自動実行され、前日24時間分の該当投稿がスプレッドシートに追記されます。
スプレッドシートへの自動集約と活用方法
収集データはGoogleスプレッドシートに以下の列で蓄積されます。
- 収集日時:GASが実行された日時
- ツイートID:重複チェック用・URLの生成にも使用
- 本文:投稿テキスト全文
- いいね / RT / 返信数:エンゲージメント指標
- URL:元の投稿へのリンク
- 投稿日時:X上の投稿日時
このデータを活用する方法として、以下を実践しています。
- スプレッドシートのフィルタ機能で「いいね数の多い順」に並び替えて重要投稿を把握
- 週次でキーワードの出現傾向を確認してトレンドの変化を把握
- 参考になった投稿に手動でタグ列を追加して分類・整理
実装での注意点
APIレート制限について
X API v2 の Free プランには月間の読み取り上限があります(2026年5月時点)。日次100件の収集であれば概ね問題ありませんが、複数のキーワードセットで大量収集する場合はプランのアップグレードが必要になる場合があります。
APIレスポンスのステータスコードが
429 の場合はレート制限超過です。スクリプト内で getResponseCode() === 429 を検知して早期リターンするか、Utilities.sleep() で待機する処理を追加してください。
認証トークン管理
Bearer Token をスクリプト内にハードコードするのはセキュリティ上好ましくありません。GASのプロパティサービスを使ってトークンを安全に管理することを推奨します。
// 初回のみ実行してトークンを保存
function saveToken() {
PropertiesService.getScriptProperties()
.setProperty('X_BEARER_TOKEN', 'ここにトークンを貼り付け');
}
// スクリプト内での取得方法
const BEARER_TOKEN = PropertiesService.getScriptProperties()
.getProperty('X_BEARER_TOKEN');
応用アイデア:Difyと連携した分析
収集したデータをDifyと組み合わせることで、さらに高度な活用が可能です。
アイデア①:週次サマリーの自動生成
週分のスプレッドシートデータをCSV形式でDifyに渡し、「今週の医療DXトレンドを3つにまとめて」とプロンプトする週次レポート自動生成ワークフローを構築できます。GASからDifyのAPIエンドポイントを呼び出す連携が可能です。
アイデア②:重要度スコアリング
スプレッドシートに蓄積したデータをRAGの知識ベースとして取り込み、「この情報は自社のサービスと関係があるか?」という観点でLLMにスコアリングさせることで、重要度の高い投稿を自動的に絞り込めます。
アイデア③:競合・キープレイヤーのモニタリング
特定アカウントの投稿を収集する場合は、検索クエリに from:アカウント名 を組み合わせます。業界の有力プレイヤーや競合の動向を自動収集・蓄積することで、定期的な業界レポートの素材になります。
まとめ
X API v2 と GAS の組み合わせで、医療DX関連投稿の自動収集システムを構築しました。実装のポイントをまとめます。
- X Developer Portal でアプリを作成し Bearer Token を発行する
- GAS から
GET /2/tweets/search/recentを Bearer Token 認証で呼び出す - 結果をスプレッドシートに追記し、ツイートIDで重複チェックする
- 時間主導型トリガーで毎日自動実行する
- Bearer Token は PropertiesService で安全に管理する
このシステム構築にかかった実作業時間は約3時間でした。毎日のモニタリング工数がゼロになる効果を考えると、非常に費用対効果の高い自動化です。Difyとの連携も含め、類似システムの構築を検討している方はお気軽にご相談ください。
業務自動化・情報収集の仕組みを一緒に作りませんか?
GAS・X API・Dify連携などの自動化システム構築もgiverthで対応しています。
まずは30分の無料ヒアリングからどうぞ。