医療DXの現場では、新しい技術・制度・事例の情報収集が常に必要です。ところが、情報は分散していて、毎日手動でチェックするのは現実的ではありません。X(旧Twitter)には医療DX関連の投稿が日々流れていますが、重要な情報を見逃さず拾い続けるのは難しい。

そこでgiverthでは、X API v2 と Google Apps Script(GAS)を組み合わせ、医療DX関連ワードの投稿を自動収集してスプレッドシートに集約するシステムを構築しました。この記事では、その全工程を公開します。

なぜ医療DXのトレンド情報収集をX APIで自動化したか

医療DX分野でコンサルティング・支援を行う上で、以下の情報を常にキャッチアップする必要があります。

  • 電子カルテ・医療情報システムの動向
  • 診療報酬改定・医療制度の変更情報
  • AI・ロボティクスの医療応用事例
  • 医療機関のDX推進事例・失敗事例
  • 競合他社・有力プレイヤーの動向

これらをXで手動収集していましたが、情報量が多く見逃しも発生していました。また、重要な投稿を後から検索・参照しようとしても埋もれてしまうことが課題でした。

自動収集の目的
毎日のモニタリング工数をゼロにする・重要情報を見逃さない・過去データを蓄積して分析に使う——の3点を同時に達成するために自動化を選択しました。

システム構成(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認証・投稿取得コード

事前準備

  1. X Developer Portal(developer.twitter.com)でアプリを作成
  2. Bearer Token を発行してコピー
  3. Google スプレッドシートを新規作成してスプレッドシートIDをコピー
  4. スプレッドシートの「拡張機能」→「Apps Script」でエディタを開く

メインスクリプト

Code.gs
// ===== 設定 =====
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関連投稿の自動収集システムを構築しました。実装のポイントをまとめます。

  1. X Developer Portal でアプリを作成し Bearer Token を発行する
  2. GAS から GET /2/tweets/search/recent を Bearer Token 認証で呼び出す
  3. 結果をスプレッドシートに追記し、ツイートIDで重複チェックする
  4. 時間主導型トリガーで毎日自動実行する
  5. Bearer Token は PropertiesService で安全に管理する

このシステム構築にかかった実作業時間は約3時間でした。毎日のモニタリング工数がゼロになる効果を考えると、非常に費用対効果の高い自動化です。Difyとの連携も含め、類似システムの構築を検討している方はお気軽にご相談ください。

業務自動化・情報収集の仕組みを一緒に作りませんか?

GAS・X API・Dify連携などの自動化システム構築もgiverthで対応しています。
まずは30分の無料ヒアリングからどうぞ。

無料相談はこちら