はじめに
Qiitaに書いた過去の自分の記事をGemini(Gem)にコンテキストとして食わせるため、GASで同期スクリプトを書きました。
15分おきに自動実行させることで、記事の更新を準リアルタイムでGeminiが参照できるようになります。
メリット
- 完全無料: Googleの無料枠で完結。
- メンテナンスフリー: クォータ上限で止まる(翌日自動復帰)だけなので、従量課金の心配がありません。
- Geminiの制約回避: ドライブ参照のファイル数制限をコード側で対策しています。
準備
-
Qiitaアクセストークン: 設定 > アプリケーションで発行。スコープは
read_qiitaのみ。 -
フォルダ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分間隔)の設定
スクリプトを保存後、以下の手順でトリガーを設定します。
- GASエディタ左側の「時計アイコン(トリガー)」をクリック。
- 右下の「トリガーを追加」をクリック。
- 以下のように設定して保存。
-
実行する関数:
syncQiitaWithArchive -
イベントのソース:
時間主導型 -
時間ベースのトリガーのタイプ:
分単位のタイマー -
時間の間隔を選択:
15分おき
-
実行する関数:
工夫した点:Geminiのファイル数制限対策
Geminiのドライブ参照にはファイル数上限(約20個)があるため、以下の構成にしています。
- 最新の10件: 個別ファイルとして保存。(10件設定で動かしていますが、今のところ問題ありません)
- それ以前の全記事: 1つのアーカイブファイルに集約。
これにより、情報の鮮度と網羅性を両立させました。
Gemini (Gem) の設定例
Gemの指示(Instructions)に「Googleドライブの指定フォルダを検索して、私のQiita記事を元に回答して」と記述します。
おわりに
一度セットしてしまえば、あとはQiitaを更新するだけでGeminiの参照用データも同期されます。自分の最近のアウトプットをGeminiが把握した前提で会話ができるようになるため、回答の精度や文脈の理解度が上がり、非常に快適です。