毎週の定例会議やプロジェクトごとのキックオフを、開催のたびにカレンダーへ登録して参加者へ招待メールを送っている会社は多いはずです。
件名や参加者リストが少しずつ違う会議が並行して走っていると、登録漏れや招待し忘れが起きやすくなります。
この記事ではGoogle Apps Scriptで年間の会議予定をまとめて作成し、参加者への招待メールも一括で送る仕組みを、送信時の注意点まで整理しています。
完成イメージと仕組み
完成すると、年間の会議予定を入力したシートから、開催日時・参加者・会議室情報を読み取ってカレンダーへまとめて登録される状態になります。
参加者のメールアドレスをシートに入力しておけば、登録と同時にカレンダーの招待メールも自動で届く仕組みです。
実際に動くのは、シートの行をひとつずつ確認し、まだ登録していない行だけをカレンダーへ書き込む処理です。
参加者への招待をせず予定だけを一括登録したい場合は、より簡易な方法を別記事で紹介しています。
手順
シートの準備からテスト実行まで、3つのステップで完成します。
Step1. 会議予定シートを準備する
登録元になるシートを新規に用意し、1行目に見出しを入れます。
2行目以降には会議の予定を入力していきます。
列の並びは次のとおりです。
| 列 | 入力内容 | 記入例 |
|---|---|---|
| A列 | 会議名 | 週次定例_営業部 |
| B列 | 開始日時 | 2026/07/20 10:00 |
| C列 | 終了日時 | 2026/07/20 11:00 |
| D列 | 参加者メールアドレス | |
| E列 | 会議室またはMeetリンク | 会議室A |
| F列 | 登録済みフラグ | 空欄のまま |
D列は参加者が複数いる場合、カンマ区切りで並べて入力します。
E列には会議室名を入れてもよいですし、あらかじめ発行したGoogle MeetのURLを貼り付けてもかまいません。
F列は空欄のまま残し、スクリプトが登録を終えた行に自動で書き込みます。
Step2. コードを貼り付ける(コード全文)
スプレッドシート上部のメニューから拡張機能を開き、Google Apps Scriptを選ぶとスクリプトエディタが立ち上がるので、表示されているコードを全て消します。
そこへ次のコードを貼り付けます。
function registerMeetingsToCalendar() {
const sheetName = '会議予定'; // ★ここを変える: 予定表のシート名
const registeredMark = '登録済み';
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
if (!sheet) {
throw new Error(`シート「${sheetName}」が見つかりません`);
}
const calendar = CalendarApp.getDefaultCalendar();
const lastRow = sheet.getLastRow();
const dataRange = sheet.getRange(2, 1, lastRow - 1, 6);
const rows = dataRange.getValues();
rows.forEach((row, index) => {
const [title, startTime, endTime, guests, location, registeredFlag] = row;
if (registeredFlag === registeredMark) {
return;
}
if (!title || !startTime || !endTime) {
return;
}
const options = {
location: String(location || ''),
guests: String(guests || ''),
sendInvites: true,
};
calendar.createEvent(String(title), new Date(startTime), new Date(endTime), options);
sheet.getRange(index + 2, 6).setValue(registeredMark);
});
} rows.forEach がシートの各行を順番に確認し、F列がすでに登録済みの行はそこで処理を止めて次の行に進みます。
会議名・開始日時・終了日時のいずれかが空の行も同じように飛ばします。
条件を満たした行だけが calendar.createEvent でカレンダーに書き込まれ、D列に入力した参加者がゲストとして追加されます。
sendInvites: true を指定しているため、この時点で参加者宛てに招待メールが送信されます。
Step3. 1件だけでテストする
いきなり全件を登録する前に、シートの2行目だけを対象に動作を確認します。
3行目以降の予定は一時的に別のシートへ退避しておくと安全です。
D列の参加者欄には、自分自身か社内の検証用アドレスだけを入れておきます。
準備ができたらスクリプトエディタの実行ボタンを押します。
初回実行時は権限の承認画面が表示されるため、内容を確認して許可を進めてください。
実行が終わったらカレンダーに予定が登録されているかを確認し、指定したメールアドレスに招待メールが届いているかもあわせて見ておきます。
問題がなければ退避しておいた予定行を元に戻し、実際の参加者を入力したうえで全体を実行します。
参加者の招待を省いて予定だけをまとめて登録したい場合は、基本の一括登録方法を別記事で解説しています。

二重登録と招待メール大量送信の注意
このスクリプトは、F列の登録済みフラグと処理のスキップ条件が連動することで二重登録を防いでいます。
registeredFlag === registeredMark の判定が過去に登録済みの行をその場で除外し、登録が終わった直後にF列へ文字を書き込むことで次回以降の実行から確実に外れる状態を作っています。
F列の文字を手動で消してしまうと、その行は未登録として扱われ、実行のたびに同じ会議が登録され続けるため、F列は手で編集しない列と決めておくと安全です。
もうひとつ注意したいのが招待メールの送信件数です。
sendInvites はこのコードのように明示的に true を指定しない限り送信されない設定になっており、初期状態ではオフです。
年間の会議予定を数十件まとめて実行すると、参加者ごとに招待メールが一斉に届くことになります。
社外の取引先が含まれる会議名や参加者リストに誤りがあると、その分だけ誤送信が広がってしまうため、初回実行は必ずテスト用のメールアドレスに絞ってから本番の参加者に切り替えてください。
毎週同じ曜日に開催する定例会議を1行ずつ入力するのが手間な場合、CalendarApp.newRecurrence() と createEventSeries を使う方法もあります。
これは繰り返しルールごとカレンダーに登録する仕組みですが、設定を1件間違えると大量の会議に一度に反映されてしまいます。
まずはこの記事のように1行1回分の会議として管理し、運用が固まってから繰り返し登録への切り替えを検討すると安全です。
またE列に入力する会議室やMeetリンクは、このコードでは文字列として登録するだけの扱いです。
実際に有効なGoogle MeetのURLを自動で発行したい場合は、別途カレンダーの高度なサービスを使う実装が必要になり、この記事の範囲を超えます。
登録した会議の直前に参加者へ持ち物や議題を思い出させたい場合は、当日の予定をまとめて知らせる方法も参考になります。

Google Apps Scriptでの会議登録とゲスト招待について相談してみませんか。
「参加者のメールアドレス管理をどう設計すればいいか分からない」「会議室予約システムと連携させたい」「社内にGoogle Apps Scriptを設計できる人材がいない」。
少しでも心当たりがあれば、お気軽にご相談ください。
現在、Google Apps Scriptを使った業務自動化のお悩みをお伺いする 無料の個別相談 を実施しています。
よくある質問
Q. 参加者に招待メールを送らずカレンダーに登録だけしたい場合はどうすればいいですか。
コード内の sendInvites: true を false に変更してください。
参加者はゲストとしてカレンダーに登録されますが、招待メールは送信されない状態になります。
Q. 参加者が承諾・辞退した結果をシート側で確認できますか。
このスクリプトはカレンダーへの登録までを行うもので、参加者の返信状況はシートには反映されません。
出欠状況を確認したい場合は、Googleカレンダーの該当する予定を開いてゲスト欄を直接確認してください。
Q. 会議室が別のカレンダーで管理されている場合はどうすればいいですか。
会議室用のカレンダーIDが分かっていれば、D列と同じ扱いでゲストとして会議室のメールアドレスを追加すると、会議室側のカレンダーにも予定が反映されます。
会議室のメールアドレスは、Google Workspaceの管理者に確認してください。
Q. 開催日時を後から変更したい場合はどうすればいいですか。
このスクリプトは新規登録だけを行う作りのため、シート側で日時を修正してもカレンダー側には反映されません。
変更したい場合は、対象行のF列を空欄に戻したうえで、カレンダー側の該当する会議を手動で削除してから再実行してください。