指定したGoogleドキュメントを複製し、次回の議事録のファイル名・見出し・開催日を更新するGASの例です。元の開催日から7日後へ進め、開催回数を1つ増やします。会議内容の要約や議事録本文の自動生成は行いません。
練習用の議事録を用意する
ファイル名は「20261023_第12回 「定例会議」議事録」の形式にします。日付は西暦4桁を含む8桁、回数は半角数字、回数の後ろは半角スペースです。2000~2099年の日付と1~999999回を入力条件としています。
本文直下に「第12回 「定例会議」議事録」という「見出し1」の段落と、「開催日:2026/10/23」という段落をそれぞれ1つ作ります。「:」は全角です。表・ヘッダー・フッター内ではなく、通常の本文に置いてください。子タブを持たない1タブの文書を対象とします。
この例なら新しいファイル名は「20261030_第13回 「定例会議」議事録」、開催日は「開催日:2026/10/30」です。本文中の他の日付、過去の記録、議題はそのまま複製されます。次回向けに残す内容か、作成後に確認してください。
複製元と出力先をIDで指定する
Apps Scriptプロジェクトに下のコードを保存します。SOURCE_FILE_IDを複製元ドキュメントのURLの「/d/」と「/edit」の間のID、OUTPUT_FOLDER_IDを出力先フォルダURLの「/folders/」に続くIDに変更します。URL全体は入力しません。出力先を編集できることと、共有範囲を確認してください。
フォルダ内の最初のファイルが最新とは限らないため、この版では最新ファイルの自動選択を行いません。今回の複製元を利用者が確認して指定します。日付は実行した当日からではなく、元のファイル名の日付から計算します。
次回分を1件作るスクリプト
function nextMinutesPlan_(name) {
const m = /^(20\d{2})(\d{2})(\d{2})_第([1-9]\d{0,5})回 (.+)議事録$/.exec(name);
if (!m) throw new Error('ファイル名の形式を確認してください');
const date = new Date(Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3])));
const compact = d => d.toISOString().slice(0, 10).replace(/-/g, '');
if (compact(date) !== m[1] + m[2] + m[3]) throw new Error('存在しない日付です');
const oldDate = date.toISOString().slice(0, 10).replace(/-/g, '/');
date.setUTCDate(date.getUTCDate() + 7);
const title = '第' + (Number(m[4]) + 1) + '回 ' + m[5] + '議事録';
return {oldTitle: name.slice(9), oldDate, title,
newDate: date.toISOString().slice(0, 10).replace(/-/g, '/'), name: compact(date) + '_' + title};
}
function minutesFields_(doc, plan) {
const tabs = doc.getTabs();
if (tabs.length !== 1 || tabs[0].getChildTabs().length) throw new Error('子タブのない1タブの文書で試してください');
const body = tabs[0].asDocumentTab().getBody(), titles = [], dates = [];
for (let i = 0; i < body.getNumChildren(); i++) {
const child = body.getChild(i);
if (child.getType() !== DocumentApp.ElementType.PARAGRAPH) continue;
const p = child.asParagraph();
if (p.getText() === plan.oldTitle && p.getHeading() === DocumentApp.ParagraphHeading.HEADING1) titles.push(p);
if (p.getText() === '開催日:' + plan.oldDate) dates.push(p);
}
if (titles.length !== 1 || dates.length !== 1) throw new Error('見出し1と開催日の段落を各1つにしてください');
return {title: titles[0], date: dates[0]};
}
function createNextMinutes() {
const SOURCE_FILE_ID = '複製元のGoogleドキュメントID';
const OUTPUT_FOLDER_ID = '出力先フォルダID';
const lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) throw new Error('同じプロジェクトで実行中です');
try {
const source = DriveApp.getFileById(SOURCE_FILE_ID);
if (source.getMimeType() !== 'application/vnd.google-apps.document') throw new Error('Googleドキュメントを指定してください');
const plan = nextMinutesPlan_(source.getName());
minutesFields_(DocumentApp.openById(SOURCE_FILE_ID), plan);
const folder = DriveApp.getFolderById(OUTPUT_FOLDER_ID);
if (folder.getFilesByName(plan.name).hasNext()) throw new Error('同名の次回議事録があります。結果を確認してください');
const copy = source.makeCopy(plan.name, folder);
console.log('作成したファイルID: ' + copy.getId());
const doc = DocumentApp.openById(copy.getId());
const fields = minutesFields_(doc, plan);
fields.title.setText(plan.title).setHeading(DocumentApp.ParagraphHeading.HEADING1);
fields.date.setText('開催日:' + plan.newDate);
doc.saveAndClose();
console.log('更新完了: ' + copy.getUrl());
} finally {
lock.releaseLock();
}
}
エディタでcreateNextMinutesを選び、手動で1回実行します。初回はGoogleドキュメントとDriveへの権限を確認して認可してください。拡張Drive APIやWebアプリのデプロイは、このコードでは不要です。実行ログの「更新完了」に続くURLを開き、ファイル名・見出し・開催日を確認します。
変更範囲と書式の注意
更新するのは元の見出しと完全一致する「見出し1」の段落、および「開催日:日付」と完全一致する段落だけです。本文全体の日付や「議事録」「_」を含む文章を一括置換しません。対象が見つからない、または複数ある場合は作成前に停止します。
対象の2段落はsetTextで内容を置き換えます。その段落に入れた文字単位の装飾やインライン要素を保持する用途には向きません。練習では文字だけの段落にし、見出し1の表示と日付の書式を作成後に確認してください。他の段落は編集しません。
重複・途中失敗・次々回の扱い
出力先に同名の次回議事録があれば停止します。同じ元ファイルで再実行しても、既存結果を上書きしたり次々回へ進めたりしません。次々回を作るときは、確認済みの次回議事録のIDにSOURCE_FILE_IDを変更して手動実行します。
コピー後に編集が失敗すると、未更新または一部だけ更新されたコピーが残る場合があります。ログの作成IDと出力先を照合し、完成した議事録として扱わないでください。コードは元ファイルや途中結果を自動削除しません。通信エラー時も、再試行の前に作成済みファイルがないか確認します。
同じプロジェクトの同時実行はロックで抑えますが、手動編集や別プロジェクトとの競合は防げません。処理中は複製元と出力先を他の人や処理が変更しない状態で試してください。同名チェックは、結果が移動・改名された場合まで重複を防ぐものではありません。
この版は手動実行用で、定期トリガーは作成しません。固定した複製元IDのまま定期実行しても次々回へ進まないため、そのまま定期処理へ登録しないでください。既存の旧スクリプトにトリガーがある場合は、改訂コードへ置き換える前に停止してください。
検証範囲と公式資料
2026年10月23日にコードを見直し、ローカルの模擬環境で日付の月末・年末・うるう年、形式エラー、対象段落の一致、重複停止と他の日付の保持を確認しました。Google実環境でのコピー、認可、ドキュメント編集、表示確認は未実施です。まず架空の議事録で試してください。
Googleドキュメントのタブ操作、Paragraphの編集、DriveファイルのmakeCopyを参照してください。
旧コードはGitHubのMOTOKI-LLC/cg-method-codeにもあります。今回の改訂版と同じとは限らないため、このページのコードを使用してください。
以前の議事録の参考画像
以下は旧実装の参考画像です。新しいコードの入力形式や現在の表示を検証した画像ではありません。練習用の書式は本文の条件に合わせてください。


関連するGoogleの操作



