8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

​【無料】GASでQiita記事をGoogleドライブに自動同期して、Geminiに準リアルタイムで食わせる

Posted at

はじめに

Qiitaに書いた過去の自分の記事をGemini(Gem)にコンテキストとして食わせるため、GASで同期スクリプトを書きました。
15分おきに自動実行させることで、記事の更新を準リアルタイムでGeminiが参照できるようになります。

メリット

  • 完全無料: Googleの無料枠で完結。
  • メンテナンスフリー: クォータ上限で止まる(翌日自動復帰)だけなので、従量課金の心配がありません。
  • Geminiの制約回避: ドライブ参照のファイル数制限をコード側で対策しています。

準備

  1. Qiitaアクセストークン: 設定 > アプリケーションで発行。スコープは read_qiita のみ。
  2. フォルダID: Googleドライブで保存先フォルダを開いた際の、URLの末尾部分です。
    • 例:https://drive.google.com/drive/u/0/folders/1A2B3C4D5E6F7G8H9I0J
    • 上記の場合、1A2B3C4D5E6F7G8H9I0J がIDになります。

実装コード

GASのプロジェクトに貼り付けて、アクセストークンとフォルダIDを書き換えて保存します。

const QIITA_TOKEN = 'YOUR_QIITA_TOKEN'; 
const FOLDER_ID = 'YOUR_GOOGLE_DRIVE_FOLDER_ID'; 
const RECENT_COUNT = 10; // 個別ファイルにする数

function syncQiitaWithArchive() {
  const options = { headers: { 'Authorization': `Bearer ${QIITA_TOKEN}` } };
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const scriptProperties = PropertiesService.getScriptProperties();
  
  let page = 1;
  let allItems = [];
  while (true) {
    const res = UrlFetchApp.fetch(`https://qiita.com/api/v2/authenticated_user/items?page=${page}&per_page=100`, options);
    const items = JSON.parse(res.getContentText());
    if (items.length === 0) break;
    allItems = allItems.concat(items);
    page++;
  }

  const recentItems = allItems.slice(0, RECENT_COUNT);
  const archiveItems = allItems.slice(RECENT_COUNT);

  // 最新記事の個別同期
  recentItems.forEach(item => {
    const key = `updated_at_${item.id}`;
    if (scriptProperties.getProperty(key) !== item.updated_at) {
      const fileName = `NEW_${item.created_at.substring(0, 10)}_${item.title.replace(/[\/\?<>\\:\*\|"]/g, '_')}.md`;
      const content = `# ${item.title}\nURL: ${item.url}\n\n${item.body}`;
      const files = folder.getFilesByName(fileName);
      if (files.hasNext()) files.next().setContent(content);
      else folder.createFile(fileName, content);
      scriptProperties.setProperty(key, item.updated_at);
    }
  });

  // 過去分のアーカイブ化
  const archiveHash = archiveItems.map(i => i.updated_at).join("");
  if (scriptProperties.getProperty('ARCHIVE_HASH') !== archiveHash) {
    let archiveContent = archiveItems.map(item => `## ${item.title}\n${item.body}`).join("\n\n---\n\n");
    const archiveFileName = "Z_PAST_ARTICLES_ARCHIVE.md";
    const archiveFiles = folder.getFilesByName(archiveFileName);
    if (archiveFiles.hasNext()) archiveFiles.next().setContent(archiveContent);
    else folder.createFile(archiveFileName, archiveContent);
    scriptProperties.setProperty('ARCHIVE_HASH', archiveHash);
  }
}

定期実行(15分間隔)の設定

スクリプトを保存後、以下の手順でトリガーを設定します。

  1. GASエディタ左側の「時計アイコン(トリガー)」をクリック。
  2. 右下の「トリガーを追加」をクリック。
  3. 以下のように設定して保存。
    • 実行する関数: syncQiitaWithArchive
    • イベントのソース: 時間主導型
    • 時間ベースのトリガーのタイプ: 分単位のタイマー
    • 時間の間隔を選択: 15分おき

工夫した点:Geminiのファイル数制限対策

Geminiのドライブ参照にはファイル数上限(約20個)があるため、以下の構成にしています。

  • 最新の10件: 個別ファイルとして保存。(10件設定で動かしていますが、今のところ問題ありません)
  • それ以前の全記事: 1つのアーカイブファイルに集約。

これにより、情報の鮮度と網羅性を両立させました。

Gemini (Gem) の設定例

Gemの指示(Instructions)に「Googleドライブの指定フォルダを検索して、私のQiita記事を元に回答して」と記述します。

おわりに

一度セットしてしまえば、あとはQiitaを更新するだけでGeminiの参照用データも同期されます。自分の最近のアウトプットをGeminiが把握した前提で会話ができるようになるため、回答の精度や文脈の理解度が上がり、非常に快適です。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?