ストアの掲載文を Gemini と詰めて、ようやく納得のいく一案ができたとします。取引先に見せる前に、「この時点の案」として手元に残しておきたいところです。ところが回答の下の「Share & export」を開くと、並んでいるのは Docs、Gmail の下書き、表なら Sheets、コードなら Colab や Replit です。PDF の文字はありません。
Zenn で、ChatGPT・Claude・Gemini の「会話を資料として残す機能」を公式ヘルプから比べた記事を読みました。そこでは、PDF 化だけが 3 社とも見当たらないと整理されています。個人開発で提出物の下書きを AI と詰めていると、同じところに行き当たる方は少なくないのかもしれません。
そこで、公式のヘルプとリファレンスを読み直し、Docs 経由で PDF を固定する小さな仕組みを組みました。先にお伝えしておくと、Apps Script の部分は手元で組み立てた論理(名前の付け方とフォルダ作成の流れ)を模擬環境で確かめた段階で、実際の Google アカウントでの実行結果ではありません。その線引きも本文の最後に書き残します。
公式ヘルプで確認できたこと(2026-10-15 時点)
Gemini アプリのヘルプには、関係する記述が 2 か所あります。
「回答のエクスポート」のページでは、回答の下の Share & export から Docs への書き出し、Gmail の下書き作成、表の Sheets への保存、コードの Colab・Replit への書き出しが案内されています。Docs への書き出しは「Google ドライブに新しい文書を保存する」動作です。
一方、「Gemini アプリを使う」のページの「会話からファイルを生成する」には、依頼の仕方(「これを doc にして」のような指示)と、対応形式の一覧が載っています。その一覧には Docs・Sheets のほか .pdf、.docx、.xlsx、.csv などが含まれています。
つまり、メニューに PDF が無いことと、Gemini が PDF を作れないことは別の話です。Zenn の整理は「Share & export の導線」について言えば当たっており、そこに「頼んで作らせる」道が加わる、というのが現時点の見取り図です。
PDF にする理由を先に決める
道具を選ぶ前に、何のための PDF かを一行で言えると迷いません。私が考える理由は 3 つです。
- 渡した時点の内容を固定したい。Docs のリンクで渡すと、相手は常に最新の同じ文書を見るため、後から手を入れた箇所も届いてしまいます
- あとで「あの日の案」に戻れるようにしたい。日付が名前に入っていれば、フォルダを開くだけで時系列が分かります
- 共有の範囲を文書から切り離したい。PDF は別のファイルなので、元の Docs の共有設定を広げずに渡せます
3 つのどれにも当てはまらないなら、Docs のまま使うのが一番手間の少ない選択です。
3 つの道を並べる
| 道 | 手間 | 向く場面 | 注意 |
|---|---|---|---|
| Gemini に PDF で作らせる | 依頼文に一言足すだけです | 一度きりで、見た目は任せてよいとき | 日付や保存先の名前は自分で付け直すことになります |
| Docs に書き出し、ファイル → ダウンロード → PDF | クリック数回です | 書き出した後に自分で手直しを入れたいとき | 保存先がダウンロードフォルダになり、元の文書と離れます |
| Docs に書き出し、Apps Script で固定 | 最初の設定が 5 分ほどです | 同じ作業を繰り返し、履歴を残したいとき | Drive への権限承認が必要です |
1 回きりなら上の 2 つで十分です。3 つ目は、毎週のように「提案書の下書きを Gemini と作って、相手に送る版を残す」ような繰り返しのある方に向いています。
Docs に書き出してから、日付つきで固定する
Gemini の回答を Share & export から Docs に書き出し、その文書を開いて、拡張機能 → Apps Script を選びます。次のコードを貼って保存すると、Docs のメニューに「PDF で固定」が増えます。
先に解こうとしている問題は 2 つです。PDF を元の文書と同じ場所に集めること、そして名前に日時を入れて上書きや取り違えを避けることです。
/**
* Gemini から Docs に書き出した文書を、日付つきの PDF にして
* 同じフォルダの「PDF」フォルダへ置く(Docs 側のメニューから実行)。
*/
const PDF_FOLDER_NAME = 'PDF';
function onOpen() {
DocumentApp.getUi()
.createMenu('PDF で固定')
.addItem('日付つき PDF を作る', 'exportDocAsDatedPdf')
.addToUi();
}
function exportDocAsDatedPdf() {
const doc = DocumentApp.getActiveDocument();
const file = DriveApp.getFileById(doc.getId());
const stamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd_HHmm');
// getAs() が付ける名前は使わず、最後に自分で名前を決め直す
const blob = file.getAs(MimeType.PDF).setName(buildPdfName(doc.getName(), stamp));
const folder = getOrCreateFolder_(file, PDF_FOLDER_NAME);
const pdf = folder.createFile(blob);
const ui = DocumentApp.getUi();
ui.alert('PDF を作りました', folder.getName() + ' / ' + pdf.getName(), ui.ButtonSet.OK);
}
function buildPdfName(docTitle, stamp) {
const base = String(docTitle).replace(/[\\/:*?"<>|]/g, '_').trim() || 'untitled';
return base + '_' + stamp + '.pdf';
}
function getOrCreateFolder_(file, name) {
const parents = file.getParents();
const parent = parents.hasNext() ? parents.next() : DriveApp.getRootFolder();
const found = parent.getFoldersByName(name);
return found.hasNext() ? found.next() : parent.createFolder(name);
}なぜこう書くのかを順に説明します。
日付は yyyy-MM-dd_HHmm にしました。ファイル名を並べ替えたとき、そのまま時系列になるからです。分まで入れているのは、同じ日に何度か案を直して固定する場面があるためです。ただし同じ分に 2 回実行すると同名のファイルが 2 つできます。Drive は同名を許すので、エラーにはなりません。
フォルダ名の末尾に _ が付く getOrCreateFolder_ は、Apps Script の慣習で「メニューや実行一覧に出さない内部関数」を表します。PDF フォルダが無ければ作り、あれば再利用するので、2 回目以降も同じ場所に溜まります。
buildPdfName は、ファイル名に使えない文字を _ に置き換え、題名が空でも untitled になるようにしています。
名前で一度つまずきます
最初に思いつく形は、getAs(MimeType.PDF) が返す Blob をそのまま createFile に渡す書き方です。ところが公式リファレンスの getAs の説明に、気をつけたい一文があります。
最後のピリオド以降は既存の拡張子とみなして置き換えます。たとえば "ShoppingList.12.25.2014" は "ShoppingList.12.25.pdf" になります。
日付を 2026.10.15 のようにピリオド区切りで書く習慣があると、題名が「2026.10.15 議事録」のとき、リファレンスの規則どおりなら「2026.10.pdf」になります。日が消え、題名も消え、同じ月の別の文書と同名になりかねません。
対策は 2 つあります。名前に日付を入れるなら - か _ で区切ること。そして上のコードのように、getAs のあとで setName を呼び、最終的な名前を自分で決め直すことです。前者だけでも防げますが、後者を入れておくと、題名に付いたピリオドが残っていても影響を受けません。
動かす前に確認しておくこと
初回の実行では、Google から承認画面が出ます。このコードは Drive のファイルを読み、フォルダへ書き込むため、公式リファレンスが示す権限は https://www.googleapis.com/auth/drive です。読み取りだけの権限では createFile が通りません。
自分の Drive の自分の文書に付けるスクリプトなら、受け入れる範囲は自分で決められます。ただし、このスクリプトが入った文書をそのまま他の人に共有・コピーすると、相手の画面にも同じ承認が求められます。権限を絞る考え方は、Apps Script × Gemini 自動化の権限を最小に保つ — 明示スコープ設計とスコープ肥大の検知に詳しく書いています。
もう一つ、PDF フォルダは元の文書と同じ親フォルダの下に作られます。親フォルダが他の人と共有されている場合、Drive では配下のファイルにも共有が及びます。固定した PDF を「渡す前の下書き」として置くつもりなら、最初に親フォルダの共有状態を見ておくと安心です。Gemini が Drive のどこまで読むかという別の角度の話は、Drive を Gemini に見せたくないなら、共有を解除する前に試せる設定がありますが参考になります。
確認できたことと、できていないこと
ここまで書いたことを、確かめた範囲で分けておきます。
確かめたのは、公式ヘルプの 2 ページ(回答のエクスポート、ファイルの生成)と、Apps Script の File.getAs・Folder.createFile のリファレンスの記述です。また、上のコードを Node.js 上で Apps Script のサービスを模した部品に載せ、フォルダが 1 つだけ作られること、PDF が同じフォルダに溜まること、記号を含む題名と空の題名が想定の名前になることを確かめました。
確かめていないのは、実際の Google アカウントでの実行です。承認画面の文言、書き出した Docs の題名、PDF の見た目(表や画像の崩れ)は、お手元で一度ご覧ください。初回は、捨ててよい文書で試すことをおすすめします。
私の線引き
私は、相手に渡す版は、Docs のリンクではなく、日付の入った別ファイルにすることにしています。リンクは便利ですが、渡した瞬間から相手の画面は私の手直しに追随します。PDF は不便な分だけ、「あの日の案」が動かなくなります。
使い始めるなら、まず Docs に書き出した文書でメニューを 1 回押し、PDF フォルダに何ができたかを見てみてください。そのあと必要なら、名前の形式を自分の整理に合わせて直せば十分です。
関連して、Sheets から呼ぶ Gemini の使用量を台帳で追う工夫は、Sheets から呼ぶ Gemini の月額を、年末の値上げ日をまたいで Apps Script で割り出すにまとめています。