「また慶弔金のやりとり、忘れてた!」
「あれ、お返しはもう済んだっけ?」
「夫婦で管理がバラバラで、二重でお返ししちゃった…」
こんな経験、ありませんか?
慶弔金の管理は地味にめんどうで、しかも夫婦で情報共有がうまくいかないと、トラブルの原因にもなりがち。
かといって、わざわざ有料アプリを導入して月額費用をかけたくもありません。
僕自身、有料アプリに課金までして試したもののイマイチしっくりくるものがありませんでした。
ならば、スプレッドシートを使って慶弔金管理を無料でできるようにしてしまおう!というのがこの記事の目的です。

よし!それならば、自分で作ってしまおう!
そこで、慶弔金管理シートを完成させるまでの道のりを忘備録的に残すために記事を書きました。
慶弔金管理シートを自作できれば、慶弔金のやりとりにかかる無駄な手間を省いて、スマホでいつでもどこからでも共有できるようになります。
初心者でもコピペで作れるように実例コードも貼っていますので、もし“自分で作る”ということに興味がある方はぜひご覧ください。
作り方には興味がないよ、慶弔金管理のスプレッドシートだけ欲しいって方は記事最後のLINE登録で慶弔金管理シートをプレゼントしていますのでよければどうぞ。
スプレッドシートで慶弔金管理をする4つの理由
1. コストゼロで始められる
Googleスプレッドシートは完全無料。スマホでもPCでも使えます。有料アプリのように月額費用がかかることもありません。
2. 夫婦でリアルタイム共有できる
スプレッドシートの強みは「共有機能」。夫婦それぞれのスマホやPCから同時に編集・確認ができ、情報のズレや漏れが起こりません。
3. 自分流にカスタマイズできる
有料アプリは機能が決まっていますが、スプレッドシートなら必要な項目だけ追加・修正でき、自分たちに最適な管理シートを作れます。
4. 自動化でラクして管理できる
Google Apps Script(GAS)を使えば、リマインダーや集計作業も自動化。特別な知識がなくても、コピペでOKです。
慶弔金管理シートを自作しようと思ったワケ
私自身、慶弔金のやりとりで何度も「あれ、もうお返ししたっけ?」と悩んだことがあります。
特に夫婦で情報共有がうまくいかず、二重でお返ししてしまった苦い経験も…。
有料アプリも試しましたが、結局使いこなせず、月額料金がもったいないと感じました。
「お金をかけず、時間と労力もかけず、ラクして管理したい!」
そんな思いから、自分で好きなようにスプレッドシートで作ってみようと考えました。
スマホでも簡単に操作できるし、しかもタダ!
どこでもサクッと記録・確認できて、夫婦間のストレスも激減しました。
慶弔金管理シートの基本設計
完成イメージ


入力するときは、スプレッドシート上でポチポチ入力するのはやりづらいので、理想はGoogleフォームを使用して入力していきたいと思います。
Googleフォームとは、Googleが提供する無料のフォーム作成ツールで、アンケートや申込フォーム、テスト、問い合わせ用フォームなどを簡単に作ることができます。作成したフォームは、パソコンやスマートフォンから入力・回答ができ、Googleスプレッドシートと連携してデータ分析も可能です。
Googleフォームで入力すれば、スマホからの入力がやりやすいので入力漏れも少なくできそうです。
必須項目
7つの必須項目を軸にシートを作成しましょう。
最低限、これだけの項目があればいいかなぁというものを書き出してみました。
- 日付(受取/返礼品発送日)
- 項目(結婚/出産/葬儀など)
- 対象者(親戚/友人/職場関係)
- 入金(もらったお金)
- 出金(あげたお金)
- ステータス(お返し未了/完了)
- メモ(お返ししたモノ/されたモノ)
作成手順
作成手順は以下の6ステップで作成していきます。
- 「集計表」シートを作成する
- 入力するためのフォームを作成
- フォームの回答にスプレッドシートのリストを表示させる
- 逆にスプレッドシートのリストにないものはフォームから自動追加する
- リマインドメール機能を実装する
- おまけ:お返し済の一括チェック機能を実装する
1.「集計表」シートを作成する
まずは、もらったモノやわたしたモノを選択すれば、一覧がザッと表示される集計表シートの大枠を作成していきます。下記のようなレイアウトで作成します。
ポイントは、F4セルにメールアドレス欄を設けていることです。
これは、後ほどこのメールアドレスにリマインドメールを送る際に利用します。
「▶入力はこちらのURLから」と記載があるところには、これまた後ほど作成する入力フォームへ飛ぶURLをリンクで貼ります。
このリンクをクリックすると、入力フォームへすぐ飛べるので手間がありません。


2.入力するためのフォームを作成
さて、入力フォームを作成していきましょう。
先ほどの「集計表」のスプレッドシートを開いた状態で、「ツール」の「新しいフォームを作成」から質問項目を作成していきます。


フォームには、ザッと下記のような質問項目を追加していきます。
- それは頂いたものか渡したものどちらですか?(もらったモノ/わたしたモノ)
- いつもらった/わたしましたか?(日付)
- 項目(結婚/出産/葬儀など)
- 対象者名(親戚/友人/職場関係)
- 対象者がリストにない人(←新規追加)
- もらった/わたした金額はいくらですか?(入金/出金額)
- メモ(お返ししたモノ/されたモノなど備考)
3.フォームの回答にスプレッドシートのリストを表示させる
フォームを作っていると、入力上の不都合な点がありました。
それは、対象者名を入力するのがすべて手入力だととても面倒くさいという点です。
その「面倒くさい」を解消するにはどうすればいいかを考えました。
スプレッドシート上に最初に対象者リストを作成しておき、その対象者リストからフォーム入力時に、リストを取得してくれば自分で入力する手間が省けるぞ!という結論がでました。




で、この機能を実装するためには、どうやらGAS(スクリプト)を書かなければ実行できないということもわかりました。


実際に書いたスクリプトがこちら⇩
function updatePeopleList() {
// スプレッドシートのB列「対象者名」を取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('対象者リスト'); // 対象シート(必要に応じて変更)
const names = sheet.getRange(2, 2, sheet.getLastRow()-1).getValues().flat(); // B2:B最終行
// 連携されているGoogleフォームのURLを自動取得
const form = FormApp.openByUrl(ss.getFormUrl());
// Googleフォーム内の対象質問(名前を選ぶ質問、例えば「対象者名」)を特定
const items = form.getItems(FormApp.ItemType.LIST); // プルダウン型
items.forEach(function(item){
if(item.getTitle().indexOf('対象者名') !== -1){
const listItem = item.asListItem();
listItem.setChoiceValues(names);
}
});
}
ただ、これだけでは自動更新されません。そこで自動更新させたい時、とても便利な機能がGASには備わっています。
それが、「トリガー」という機能です。
先ほど書いた関数を実行する時間や条件などを設定して、自動で実行してくれるようにできます。
Excelだと、自動化するにはコードを書いていかないとできないものが、条件をポチポチ設定しておくだけで自動化が実現します。
こちらもApp Scriptから設定していきます。




これで入力する際に、手入力する手間が省けました。
4.逆にスプレッドシートのリストにないものはフォームから自動追加する
リスト入力を実現できたところで、またしても課題が見つかりました。
そのままではリストにない人を入力することができません。
ここは、新規入力なので手入力するしかないのですが、入力した内容を次回以降入力しなくていいようにスプレッドシートのリストに追加しておきたいところです。


こちらもスクリプトを書いていきます⇩
function addNewPeopleFromFormResponses() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const formSheet = ss.getSheetByName("フォームの回答");
const listSheet = ss.getSheetByName("対象者リスト");
// 対象者リスト既存名取得(スペース除去して比較用配列)
const existingNamesRaw = listSheet.getRange(2, 2, listSheet.getLastRow() - 1, 1).getValues().flat();
const existingNames = existingNamesRaw.map(name => normalizeName(name));
// フォームの回答データ取得
const lastRowForm = formSheet.getLastRow();
if (lastRowForm < 2) return; // データなし
const formData = formSheet.getRange(2, 3, lastRowForm - 1, 6).getValues();
// formData[行][0]=C列(対象者名), [5]=H列(対象者がリストにない人)
let listAppendData = []; // 対象者リストに追加する行([名前, カナ(空) ]の配列)
let updateFormRows = []; // フォーム側のC列更新指示 [行番号, 名前]
for (let i = 0; i < formData.length; i++) {
const currentName = formData[i][0]; // C列
const newNameRaw = formData[i][5]; // H列
if (!currentName && newNameRaw) {
const normalized = normalizeName(newNameRaw);
// 既存と突合(スペース除去比べ)
if (!existingNames.includes(normalized)) {
// [B列: 名前, C列: カナ(空)]
listAppendData.push([newNameRaw, ""]);
existingNames.push(normalized); // 追加候補も即時重複防止
}
updateFormRows.push([i + 2, newNameRaw]);
}
}
// 名簿シート追記(A列には追加しない=No.はシート関数任せ)
if (listAppendData.length > 0) {
listSheet.getRange(listSheet.getLastRow() + 1, 2, listAppendData.length, 2).setValues(listAppendData);
}
// フォームC列を更新
updateFormRows.forEach(r => {
formSheet.getRange(r[0], 3).setValue(r[1]);
});
SpreadsheetApp.flush();
}
// 名前の全角・半角スペースをすべて削除
function normalizeName(name) {
if (!name) return "";
return name.toString().replace(/\s/g, "").replace(/ /g, "");
}
2つの関数がありますが、簡単に中身の解説しておきます。
処理の流れ
- 「対象者リスト」シートのB列(対象者名)をすべて読みます。
- 名前があるスペース(半角・全角の空白)はすべて取り除いた形に変換して記録します。
→ 名前の比較時に「山田 太郎」と「山田太郎」を同じ名前として判定するため。
- 「フォームの回答」シートの、2行目以降のデータを見ていきます。
- 対象者名(C列)がたまたまで、かつ「対象者がリストにない人」(H列)に名前が入っている行を探します。
- 見つかった名前をスペース削除後に比較し、すでに「対象者リスト」に同じ名前があれば追加はしません。
- 「対象者リスト」にない場合は、新しい名前として登録候補になります。
- 新しい名前を「対象者リスト」シートの末尾に追加します。
- A列(No.)はシート側で自動連番を想定しているため、GASではB列(対象者名)とC列(対象者名カナ)だけ追加します。
- 今日はカナはついでに追加します(自動変換機能をつければここにカタカナを入れることも可能です)。
新しい名前を、元の回答行のC列(対象者名)に書き込みます。こうすることで「フォームの回答」シートのC列も正しく埋められます。
これで、完了
5.リマインドメール機能を実装する
この慶弔金管理シートの目玉機能、リマインドメールを実装していきます。
「もらったモノ」で、かつ、もらった時点から30日経った時に「お返し忘れていませんか?」とリマインドメールを自動で送信できるようにします。
これまたスクリプトを書いていく必要があります。


実際のコードがコチラ⇩
function sendGiftReminder() {
// 各種シートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const formSheet = ss.getSheetByName("フォームの回答");
const summarySheet = ss.getSheetByName("集計表");
// メールアドレス取得(集計表F4)
const mailAddress = summarySheet.getRange("F2").getValue();
if (!mailAddress) {
Logger.log("集計表シートのF2セルにメールアドレスが入力されていません。");
return;
}
// データ最終行判定(B列で)
const lastRow = formSheet.getLastRow();
if (lastRow < 2) {
Logger.log("フォームの回答シートにデータがありません。");
return;
}
const rangeValues = formSheet.getRange(2, 2, lastRow - 1, 7).getValues(); // B2:Hxxx
const today = new Date();
let notifyRows = [];
rangeValues.forEach(function(row, idx) {
const dateVal = row[0]; // B列(いつもらった/わたしましたか?)
const amount = Number(row[3]); // E列(もらった/わたした金額)
const getOrGive = row[4]; // F列(もらったモノ/わたしたモノ)
const status = row[6]; // H列(ステータス)
// 日付が有効な値かつ日付オブジェクト
if (!dateVal || !(dateVal instanceof Date)) return;
// 金額が1以上か
if (!(amount >= 1)) return;
// F列が「もらったモノ」か
if (getOrGive != "もらったモノ") return;
// H列が未了、または空欄か
if (status && status !== "未了") return;
// 30日経過判定
const daysPassed = Math.floor((today - dateVal) / (1000 * 60 * 60 * 24));
if (daysPassed < 30) return;
// 該当行データを整形して格納(例:行番号、日付、金額など…必要に応じ調整)
notifyRows.push(
`受付日: ${Utilities.formatDate(dateVal, Session.getScriptTimeZone(), "yyyy/MM/dd")}\n` +
`金額: ${amount} 円`
// 必要に応じ他カラムも追記
);
});
if (notifyRows.length > 0) {
const subject = "お返しはできていますか?";
let body = "下記のお祝い・お見舞い(もらった分)について、30日経過時点でお返しが未了(または未チェック)なものがあります:\n\n";
body += notifyRows.join('\n-------------------\n');
body += "\n\n慶弔金管理シートのご確認をお願いいたします。";
MailApp.sendEmail(mailAddress, subject, body);
Logger.log("該当分まとめてリマインドメール送信済み");
} else {
Logger.log("リマインドメール該当行なし");
}
}
リスト更新の関数と同様にトリガーを設定して自動化しておきます。


時間主導型で、毎朝6〜7時ごろにチェックをかけてメールを送信するトリガーにしています。
これで、「集計表」シートのF4セルに有効なアドレスが記入されていれば、メールが送られるようになります。
6.おまけ:お返し済の一括チェック機能を実装する
おまけ機能として、もらったモノをすべて返礼した際に、ボタンをおせばステータスを一括で「済」に変更する関数も作成しました。
ひとつひとつポチポチチェックしていくのもいいですが、わたしの何でもラクしたい主義に反するので実装を決めました。


関数はコチラ⇩
function setAllReceivedToCompleted() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const formSheet = ss.getSheetByName('フォームの回答');
const lastRow = formSheet.getLastRow();
if (lastRow < 2) return; // データなし
// B〜H列(タイトル行後)
const data = formSheet.getRange(2, 2, lastRow-1, 7).getValues(); // B2:H
let updateRows = [];
for (let i=0; i<data.length; i++) {
const getOrGive = data[i][4]; // F列=そのまま(index=4、B=0〜)
const status = data[i][6]; // H列(index=6)
if (getOrGive === "もらったモノ" && (!status || status === "未了")) {
updateRows.push(i+2); // 行番号(2始まり)
}
}
// 一括更新
if(updateRows.length>0){
updateRows.forEach(rowNum => {
formSheet.getRange(rowNum, 8).setValue("済"); // H列(=8列目)
});
SpreadsheetApp.flush();
}
}
慶弔金管理シートを共有する手順
夫婦で共有するには、下記の手順で共有者設定をしておきます。
1.シート右上の「共有」ボタンをクリック


2.共有したい人のGoogleアカウントを入力して、権限を「編集者」に設定


3.共有したい人へ通知を送信→完了


これで、スマホを使っていつでもどこからでも夫婦ともに入力・確認ができるようになります。
慶弔金管理シート プレゼント応募はこちら
下記よりLINE登録の上、「けいちょうきん」とキーワードをメッセージいただければ、今回作成した「慶弔金管理シート」を無料でプレゼントいたします。




こちらのプレゼントはスプレッドシートのみです。
入力のためのGoogleフォームは、シートごとに作り替えないといけないのでぜひ作ってみてくださいね。
おわりに
「お金をかけず、ラクして管理したい」という思いから始めた慶弔金管理シートづくり。
スマホで夫婦間共有が簡単にでき、自動化機能で時間も節約できます。
スクリプトを書いたりするのは、素人にはなかなか骨の折れる作業ですが、自動化実現に向けてワクワクするとても楽しい作業です。
Googleスプレッドシートとフォームは、誰でもすぐに始められるので、ぜひ試してみてください。
こんなものを作ってほしい、役に立った、あったら便利そうなどのご意見やご感想、ぜひお待ちしています!
コメント