Media > AI活用ユースケース > 総務 > 囲碁・将棋の会所が例会の参加の申込から対局の組合せと手合を Apps Script で決め、成人の会員ごとの組合せの連絡と例会の案内を AI で作って送る

囲碁・将棋の会所が例会の参加の申込から対局の組合せと手合を Apps Script で決め、成人の会員ごとの組合せの連絡と例会の案内を AI で作って送る

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

囲碁・将棋の会所で、例会の参加の申込と会員の段級位から、Apps Script が対局の組合せと手合を決め、OpenAI API で会員ごとの組合せの連絡と次の例会の案内の文面を作ります。席主は確認のシートで組合せを見て、送ってよいかを決めるだけになります。

サマリー
生成AI
ChatGPT/Claude
連携・自動化
Google Apps Script/Make/Zapier
対象業界
その他/教育
対象部門
総務
対象業務
分類・仕分け/書類作成
主な課題
人手が足りない/属人化している/書類作成に時間がかかる
AIで行う処理
生成
主な効果
品質標準化/属人化解消/工数削減
導入難易度
★☆☆☆☆
実装レベル
半自動化
費用感
API連携(中)
人間の確認
条件付き
現在工数
12h/月
AI導入後
2h/月
想定削減
83%
年間削減
120h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 世話役が例会の10日ほど前に、会員にメールで参加を聞く。返事はメールの返信・電話・会所での口頭がまじる
  2. 締切の後、参加者を段級位の順に並べ、4人ずつの組に分ける
  3. 直近の例会で同じ組だった人どうしが重ならないよう、紙の記録を見ながら入れ替える
  4. 組ごとに対局の順と、手合の表から置石・コミ・駒落ちを書き込む
  5. 会員ごとに、組・相手・手合・開始の時刻を書いたメールを送る
  6. 掲示板に組合せの表を貼る
  7. 例会の後、結果を名簿に書き込み、次の例会の案内に前回の結果を書く
導入後(After)
  1. 自動例会の10日前の朝、Apps Script が会員に参加の申込のフォームのリンクを送る
  2. 人会員がフォームで申し込む。電話や口頭の申込は世話役が申込のシートに1行足す
  3. 自動締切の翌朝、Apps Script が参加者を点数で並べ、組分けの決まりと対局の記録から4人ずつの組を作り、手合の表から手合を決める
  4. 自動組合せの表と、決まりを守れなかった箇所(前回と重なった、など)を確認のシートに並べる
  5. 人席主が組合せの表を見て、直したいところを直し、「組合せ確定」に印を付ける
  6. 自動会員ごとの状況(組・相手・手合を記号にしたもの、成績の状況)を OpenAI API に渡し、組合せの連絡の文面を作る
  7. 自動記号を値に置き換えて検査し、確認のシートに並べる
  8. 人世話役が文面を流し読みし、「送ってよい」に印を付ける
  9. 自動Gmail で会員ごとに送り、掲示板に貼る組合せの表を印刷用に書き出す
各工程の詳しい説明を読む
  1. 世話役が例会の10日ほど前に、会員にメールで参加を聞く。返事はメールの返信・電話・会所での口頭がまじる
  2. 締切の後、参加者を段級位の順に並べ、4人ずつの組に分ける
  3. 直近の例会で同じ組だった人どうしが重ならないよう、紙の記録を見ながら入れ替える
  4. 組ごとに対局の順と、手合の表から置石・コミ・駒落ちを書き込む
  5. 会員ごとに、組・相手・手合・開始の時刻を書いたメールを送る
  6. 掲示板に組合せの表を貼る
  7. 例会の後、結果を名簿に書き込み、次の例会の案内に前回の結果を書く

(a)組を作るのに時間がかかる。 参加者が50名を超える日は、段級位で並べて、前回と重ならないよう入れ替えて、人数が4で割り切れないときの組をどうするかを考えるだけで1時間を超えます。

(b)決め方が世話役の頭の中にある。 「この二人は前に揉めたから同じ組にしない」「この人は最近強くなったから一つ上の組で」という判断が記録に残っていません。世話役が体調を崩した月は、席主が当日の朝に組を作り直しました。

(c)手合を書き間違える。 段級位の差から置石やコミを表で引くのは単純ですが、昇段した会員の段級位を名簿で直し忘れると、古い段級位で手合が出ます。

(d)掲示板の表と連絡が食い違う。 当日の朝に組を直すと、掲示板の表は直してもメールは直っていないことがあり、会員が別の盤の前で待っていたことがあります。

(e)会員ごとの連絡が単調で長い。 組・相手・手合を書き写すだけでなく、世話役は「前回は全勝でしたね」のような一言を添えたいのですが、120名分を書く時間がなく、一言は書ける月だけです。

  1. 【自動】 例会の10日前の朝、Apps Script が会員に参加の申込のフォームのリンクを送る
  2. 【人】 会員がフォームで申し込む。電話や口頭の申込は世話役が申込のシートに1行足す
  3. 【自動】 締切の翌朝、Apps Script が参加者を点数で並べ、組分けの決まりと対局の記録から4人ずつの組を作り、手合の表から手合を決める
  4. 【自動】 組合せの表と、決まりを守れなかった箇所(前回と重なった、など)を確認のシートに並べる
  5. 【人】 席主が組合せの表を見て、直したいところを直し、「組合せ確定」に印を付ける
  6. 【自動】 会員ごとの状況(組・相手・手合を記号にしたもの、成績の状況)を OpenAI API に渡し、組合せの連絡の文面を作る
  7. 【自動】 記号を値に置き換えて検査し、確認のシートに並べる
  8. 【人】 世話役が文面を流し読みし、「送ってよい」に印を付ける
  9. 【自動】 Gmail で会員ごとに送り、掲示板に貼る組合せの表を印刷用に書き出す

5番目が、この設計の分かれ目です。 Apps Script は組合せの案を出しますが、「この二人を同じ組にしない」のような記録に無い事情は、席主が表で直します。 直した箇所は次から決まりとして足せるよう、処理ログに残します。

6番目は5番目の後にしか動きません。 組合せが確定する前に文面を作ると、席主が組を直したときに文面が古いままになります。

02今回想定するシステム構成

構成図
会員の名簿(段級位)+ 対局の記録 + 手合の表 + 組分けの決まり
+ 参加の申込(Google スプレッドシート・Google フォーム)
   │
   ▼【トリガー】毎朝(時間主導型のトリガー)
Google Apps Script
   ├──▶ 10日前:申込のフォームのリンクを送る
   ├──▶ 締切の翌朝:組分けと手合の計算 → 確認のシート
   ▼
【人】席主が組合せを確かめて「組合せ確定」
   ▼
Google Apps Script ── 会員ごとの状況を記号にする(氏名は外す)
   ▼
OpenAI API(Responses API、Structured Outputs、store=false)
   │   組合せの連絡と例会の案内の文面を記号入りで返す
   ▼
Google Apps Script ── 記号を値に置き換えて検査 → 確認のシート
   ▼
【人】世話役が流し読みして「送ってよい」
   ▼
Gmail(会員ごと)+ 掲示用の組合せの表
役割想定する製品代替候補
実行環境Google Apps ScriptMake、Zapier
生成AIOpenAI API(Responses API、Structured Outputs)Claude API
保管Google スプレッドシート(会員の名簿、対局の記録、手合の表、組分けの決まり、参加の申込、確認のシート、処理ログ)-
メールGmail(会所のアカウントから送る)-
受付Google フォーム(参加の申込)-

新しく足すのは、Apps Script と、組分けの決まり・確認のシート・処理ログの3つのシートと、申込のフォームです。 会員の名簿と対局の記録はこれまでのものを使い、手合の表は席主の紙の表をシートに写します。

Apps Script を実行環境にしているのは、組分けの計算がスプレッドシートの上で完結するからです。 段級位で並べる、前回の組と見比べる、手合の表を引く。どれもシートを読んで並べ替えるだけの処理で、新しいサーバーは要りません。

生成AIを OpenAI API にしているのは、構造化出力で返す形を厳密に決められるからです。 Structured Outputs は、与えた JSON Schema に必ず沿った応答を返すとされています。会員ごとに返ってくる文面の形がそろうので、記号の置き換えと検査を同じ処理で回せます。

03どうやって実装するのか

Step1

処理の起点を決める

時間主導型のトリガーを毎朝1回動かします。 ClockTriggerBuilder の everyDays(1) と atHour(8) で毎朝8時台を指定します。nearMinute() を呼ばないと分はランダムに決まり、呼んでも前後15分の幅があります。 公式の説明では、毎日9時のトリガーは9時から10時の間のどこかで動き、その時刻が日ごとに保たれます。

毎朝の処理では、例会の日から逆算して次のことをします。

例会の日からの日数すること
10日前参加の申込のフォームのリンクを会員に送る
4日前(締切の翌朝)組分けと手合を計算し、確認のシートに並べて席主に知らせる
組合せ確定の印が付いた次の朝会員ごとの文面を作り、確認のシートに並べる
送ってよいの印が付いた次の朝会員に送り、掲示用の表を書き出す

印を待つ処理を「次の朝」にしているのは、トリガーを増やさないためです。 印が付いたらすぐ動かすには編集のトリガーが要りますが、席主が表を直している途中で動くと、直しかけの組で文面ができます。 毎朝の1回で印を見れば足ります。

トリガーは会所のアカウントで作ります。 インストール型のトリガーは作った人のアカウントで動くので、差出人が会所の名前になります。 失敗すると「Summary of failures for Apps Script」のメールが届くので、処理ログに「どの段階で止まったか」を日本語で書きます。

Step2

入力データを集める

データ中身取得元
会員の名簿会員番号、囲碁か将棋か、段級位、段級位を直した日、メールアドレス、連絡の方法、休会中かスプレッドシート
参加の申込例会の日、会員番号、参加か、申込の経路フォームの返事と手入力
対局の記録例会の日、組、対局者、手合、勝敗スプレッドシート(例会の後に世話役が入れる)
手合の表囲碁:段級位の差ごとの置石とコミ/将棋:段級位の差ごとの駒落ちスプレッドシート(席主の表を写す)
組分けの決まり1組の人数、同じ組を避ける期間、組の上がり下がりの決まり、同じ組にしない会員の組み合わせスプレッドシート(新しく作る)

質を決めるのは、名簿の段級位と「段級位を直した日」の列です。 昇段した会員の段級位が古いままだと、組も手合も古い段級位で出ます。 例会の後に結果を入れるとき、昇段・昇級があれば同じ日に名簿を直すことを手順にします。

「同じ組にしない会員の組み合わせ」は、世話役の頭の中にあった事情を書く場所です。 理由は書かず、会員番号の組だけを入れます。理由を書くと、シートを見た人に事情が伝わってしまいます。

Step3

データの取得方法を決める

すべて同じスプレッドシートの中にあるので、Apps Script のスプレッドシートのサービスで読むだけです。

取るものどこから何に使うか
参加者参加の申込(その例会、参加)組分けの対象
段級位会員の名簿点数にして並べる
直近の組と勝敗対局の記録(直近3回の例会)同じ組を避ける、上がり下がりを決める
手合手合の表組の中の対局ごとの手合

段級位は点数にしてから並べます。 囲碁なら初段を0、二段を1、1級を−1のように置き、前回の組で全勝なら0.5を足し、全敗なら0.5を引くのように、組分けの決まりのシートにある規則で調整します。点数の付け方は会所の決まりなので、席主が変えられる形にしておきます。

同じ人が2回申し込んだら、後の申込を使います。 「参加」と送った後に「欠席」と送り直すことがあるためです。

点数の付け方の例は次のとおりです。 値はすべて組分けの決まりのシートに置きます。

項目点数の例
段級位初段を0とし、段が1つ上がるごとに+1、級が1つ下がるごとに−1
前回の組で全勝+0.5(上の組へ上がりやすくする)
前回の組で全敗−0.5
直近3回の例会に出ていない調整なし(段級位の点数だけで並べる)

点数は組の並びを決めるためだけに使い、手合には使いません。 手合は段級位の差だけで手合の表から引きます。点数で手合を決めると、前回の勝敗で置石が変わってしまい、会所の決まりと食い違います。

Step4

AIへ渡す前に整形する

  1. 参加者を点数の順に並べる … 囲碁と将棋を分け、点数の高い順に並べます
  2. 4人ずつに区切る … 上から4人ずつ組にします。4で割り切れないときは、下の組を3人にし、3人の組は席主か世話役との指導対局を1局足します
  3. 重なりを避ける … 直近3回の例会で同じ組だった人が2人以上重なる組は、隣の組の点数の近い人と入れ替えます
  4. 同じ組にしない組み合わせを外す … 決まりのシートの組み合わせに当たれば、隣の組と入れ替えます
  5. 手合を引く … 組の中の対局ごとに、段級位の差から手合の表を引きます
  6. 守れなかった箇所に印を付ける … 入れ替えても重なりが残った組、入れ替えで点数の差が大きく開いた組に印を付けます

6番目の印が、席主の確認を短くします。 席主は全部の組を見るのではなく、印の付いた組だけを見て、直すか、そのままにするかを決めます。

文面のための状況は、組合せが確定した後に作ります。

状況中身の例文面での扱い
組と相手{{組}}、{{相手1}} {{相手2}} {{相手3}}記号のまま置く
手合{{手合1}} など記号のまま置く
前回の成績の状況promoted(上の組へ)/stayed/demoted/first_time(初参加)一言の調子を変える
指導対局の有無with_lesson3人の組なら指導対局があることを書く
Step5

AIに処理させる

させるのは、会員ごとの組合せの連絡の文面を記号入りで組み立てることだけです。

書くもの渡すものAIが書くこと
冒頭の一言前回の成績の状況上の組へ上がった会員にはねぎらい、初参加には歓迎の一言
組合せの案内組・相手・手合の記号記号を表の形で並べる
当日の案内開始の時刻・持ち物の記号遅れるときの連絡先の一文
次の例会の予告次回の日付の記号申込のフォームが届くことの一文

冒頭の一言が、世話役が書きたくて書けなかった部分です。 「前回は上の組へ上がられましたね。今回は少し手ごわい組ですが、楽しんでください」のような一文を、成績の状況の名前から作ります。 勝敗の数そのものは渡しません。

させないこと理由
組合せや手合を決める・変えるApps Script の規則と席主の確認で決める
相手の名前・段級位・手合を書く記号で差し込む。写し間違いは対局の場で揉める
相手の強さ・棋風についての所見会員どうしの評判になる
昇段・昇級を約束する・見込みを書く認定は会所が決める
負けが続いた会員への慰めを強く書く本人にとって気持ちのよいものとは限らない。demoted は淡々と書く

3行目がいちばん起きやすい失敗です。 「相手の◯◯さんは攻めの強い方です」のような一言を足したがります。相手の名前を記号にして渡していても、記号に向けて「強敵」と書くことがあります。 指示で禁じ、検査で「強い」「強敵」「手ごわい相手」の語を見ます。冒頭の一言で組全体を「手ごわい組」と言うのは許し、特定の相手を評する言葉は許しません。

Step6

指示内容を固定する

あなたは囲碁・将棋の会所の世話役として、成人の会員に送る例会の組合せの連絡の文面を作ります。
渡された状況だけで書いてください。渡されていないことを足さないでください。

【書く順番】
1. 冒頭の一言(result_state に合わせる。1〜2文)
2. 組合せのご案内({{組}} と、対局ごとに {{相手n}} {{手合n}} を箇条書きで)
3. 当日のご案内({{開始時刻}} に始まること、遅れるときは {{連絡先}} へ)
4. 指導対局のご案内(with_lesson が true のときだけ)
5. 次の例会のご予告({{次回日}}。申込のご案内が届くこと)

【result_state ごとの冒頭の一言】
- promoted:上の組へ上がったことへのねぎらい
- stayed:変わらず楽しんでいただけるようにという一言
- demoted:組が変わったことには触れず、例会への参加のお礼だけ
- first_time:初めての例会への歓迎

【厳守事項】
- 相手の名前、段級位、置石、コミ、駒落ち、時刻、日付は、必ず渡された記号のまま書いてください。
- 特定の相手の強さ、棋風、性格について書かないでください。
- 昇段・昇級の見込み、勝ち負けの予想を書かないでください。
- game が go のときは「打つ」「対局」、shogi のときは「指す」「対局」と書いてください。
- 会員の名前は書かないでください。宛名はこちらで入れます。
- 本文は300字以内にしてください。

【状況】
game: {game}
result_state: {result_state}
group_size: {group_size}
with_lesson: {with_lesson}

game で「打つ」と「指す」を切り替えるのは、小さいようで大事な点です。 将棋の会員に「打つ」と書いた連絡は、会所の連絡として違和感があります。囲碁と将棋を同じ処理で回すので、指示に明記します。

demoted の一言を「触れない」にしているのは、組が下がった理由を本人が一番知っているからです。 AIに任せると「次こそは」と励ましを書きますが、受け取る側の気持ちは人によって違います。

Step7

出力形式を固定する

次の形のJSONで受け取ります。 Responses API の text.format に type: "json_schema"、strict: true でスキーマを渡します。

{
  "member_ref": "M-0231",
  "game": "go",
  "subject": "{{例会日}}の例会の組合せのご案内",
  "opening_line": "",
  "body": "",
  "used_placeholders": ["{{組}}", "{{相手1}}", "{{手合1}}", "{{開始時刻}}", "{{連絡先}}", "{{次回日}}"]
}

1つ目の理由は、冒頭の一言を分けて持てることです。 席主が自分で一言を書きたい会員には、opening_line だけを差し替えます。

2つ目は、used_placeholders で組合せの書き漏れが分かることです。 4人の組なら {{相手1}} から {{相手3}} と {{手合1}} から {{手合3}} の6つがそろっているはずで、1つでも欠ければ対局の案内が抜けています。 赤の印を付けて送りません。

Structured Outputs には決まりがあります。 公式の説明では、すべてのフィールドを required にし、additionalProperties: false を指定する必要があります。game のような決まった値は enum で絞ります。モデルが安全上の理由で応じなかったときは、応答に refusal のフィールドが入るとされているので、refusal があればその会員を飛ばし、確認のシートに出します。

リクエストでは store を false にします。 公式の説明では、Responses API は store が true のとき、アプリの状態を既定で30日保持します。会話を続ける使い方ではないので保存しません。また、API に送ったデータは、明示的に共有を選ばない限りモデルの学習や改善に使われないとされています。

検査引っかかったときの扱い
組の人数に対して {{相手n}} {{手合n}} がそろっていない赤。送らない
置き換えた後の本文に、置き換え前の数字が残る赤
「強い」「強敵」「棋風」を含む黄。世話役が読む
将棋の会員の文面に「打つ」がある(囲碁の会員に「指す」)黄
本文が300字を超える黄
Step8

システムへ連携する

つなぎ先方式内容
Google スプレッドシートApps Script のスプレッドシートのサービス名簿・申込・記録・手合・決まりを読み、確認のシートと処理ログに書く
OpenAI APIApps Script の UrlFetchApp で Responses API を呼ぶ会員ごとの文面を JSON で返す
GmailGmailApp申込のリンクと組合せの連絡を送る
Google フォーム返事がスプレッドシートに入る参加の申込を受ける

送るときは name で差出人を会所の名前にし、replyTo を世話役のアドレスにします。 会員が「当日少し遅れます」と返信したとき、世話役に届くようにするためです。

1日の送信先の数を数えます。 公式の上限は、メールの受信者の数が個人の Google アカウントで1日100、Google Workspace で1日1,500です。例会の10日前に全会員120名へ申込のリンクを送る日は、個人のアカウントだと上限を超えます。 囲碁と将棋で送る日を1日ずらすか、会所のアカウントを Google Workspace にします。

掲示用の組合せの表も書き出します。 メールの無い会員のために、確定した組合せを組ごとに並べたシートを作り、席主がそれを印刷して掲示板に貼ります。 掲示用の表には会員の名前を出しますが、AIの文面は使いません。

Step9

人が確認する

確認は2回あります。

  1. 席主が組合せの表を見る … 印の付いた組(重なりが残った・点数の差が開いた)を見て、直すかそのままにするかを決めます。直した箇所は、次から決まりのシートに足すかを考えます
  2. 世話役が文面を流し読みする … 赤は直し、黄は読んで判断します。印の無い文面は件名と冒頭の一言だけ見ます

1回目は例会ごと、2回目は会員ごとです。 1回目は組の数(60名なら15組)を見るだけで、数十分かかっていた組分けが、印の付いた数組の判断に変わります。

席主が組を直すときは、確認のシートの組の欄を書き換えるだけにします。 入れ替えた会員の手合は、印を付け直した次の朝に Apps Script が手合の表から引き直します。席主が手合まで手で書き直す必要はありません。

目標は、240件をならして1件0.5分です。 時間を使うのは席主の組合せの確認と、電話の申込の入力です。

Step10

例外に対処する

起きること対応
参加者が4で割り切れない下の組を3人にし、指導対局を足す。2人以下になる場合は席主が決める
入れ替えても重なりが残る印を付けて席主に回す
名簿の段級位を直した日が古い確認のシートに「段級位の確認」を出す
確定の後に欠席の連絡が来た当日に席主がその組を3人の組に組み直す。文面は送り直さない
締切の後の参加の申込自動では組に入れず、席主に知らせる
OpenAI API がエラー、または refusalその会員を飛ばし、組合せだけの定型の文面にする
連絡の方法が電話の会員掲示用の表と、世話役の電話の一覧に並べる
1日の送信先が上限に近づく続きを翌朝に回す
囲碁と将棋の両方に出る会員組分けは別々に行い、連絡は2通にせず1通にまとめる
手合の表に無い段級位の差手合を空にして席主に回す。表の外は席主が決める

上から3行目までは、AIの問題ではありません。 組分けの決まりと名簿の付け方の問題で、確認のシートに出たものを直すたびに、翌月の例外は減ります。

Step11

記録を残す

  • 実行の日時、対象の例会、参加者の数、作った組の数
  • 組分けの計算の結果と、席主が直した箇所と、直した理由の種類(重なり・事情・点数)
  • OpenAI API に渡した状況(氏名なし)と、返ってきた JSON
  • 検査の結果と、世話役が文面を直したかどうか
  • 送った会員の数、掲示用の表を書き出した日時

2つ目は、組分けの決まりを育てる材料です。 席主が毎回同じ直し方をしているなら、それは決まりに足せます。決まりが育つほど、席主が直す箇所は減ります。

04実装レベルの3段階

最小構成:手で組を作り、ChatGPT の画面で文面を作る / 文面の下書き
半自動化:上記+Apps Script で申込・組分け・手合を計算し、確認の後に OpenAI API で文面を作って Gmail で送る / 申込から連絡まで
本格構成:上記+例会の当日に結果をフォームで入れ、組の上がり下がりと次回の点数を自動で更新する / 結果の記録と次回の準備まで

この記事の想定は半自動化です。 本格構成で結果の入力まで自動にできますが、例会の当日に会員がその場でフォームに入れる運用は、年配の会員の多い会所では定着しにくいことがあります。世話役が紙の結果を後で入れる形のままでかまいません。 半自動化で1件3分が0.5分になります。 組分けと手合の計算、連絡の文面が自動になり、残るのは席主の確認と電話の申込の入力です。 段階を飛ばさないでください。 半自動化で数回の例会を回すと、席主が毎回直す箇所と、決まりのシートに足すべきことが処理ログから見えます。決まりが固まらないうちに結果の入力まで自動にすると、上がり下がりの計算の誤りが次の組分けにそのまま響きます。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
2 名
月間件数
240 件
1件あたり現在時間
3 分
1件あたり導入後時間
0.5 分
現在  240件 × 3分 ÷ 60 = 12 時間/月
導入後 240件 × 0.5分 ÷ 60 = 2 時間/月
月間削減時間
10h
削減率
83%
年間削減時間
120h
年間金額換算(時間単価1,500円)
18万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 囲碁・将棋の会所や同好の会で、成人の会員が数十〜百名ほどいて、月に2回ほど例会(段級位の近い者どうしのリーグ戦など)を開いている場合。会員の段級位と対局の結果を Google スプレッドシートで持ち、席主や世話役が紙と記憶で組合せと手合を決めて、会員に一人ずつ連絡している場合。組合せの作り方が一人の世話役に頼っていて、その人が休むと例会が回らない場合。
向いていない
  1. 子どもの教室や親子の大会を開く会所(18歳未満の会員の情報を扱う場合は、使う生成AIの規約を先に確かめてください)。例会の参加が十数名で、当日その場で組合せを決めて足りる場合。対局の管理を大会の運営のための専用のサービスで済ませている場合。なお、段級位の認定や昇段・昇級の判断は、この構成の対象外です。

07最小構成で試す方法

  1. 先月の例会1回分の参加者の名簿と、そのときの組合せの表を用意する
  2. 参加者の段級位と直近3回の組を表にし、第7章の前処理の手順で手で組を作ってみる
  3. 手で作った組と、世話役が実際に作った組を見比べる
  4. 手元の ChatGPT の画面に、第7章の指示の例と、5人分の状況(記号入り)を貼る
  5. 文面の記号を手で置き換え、相手の評を書いていないか、「打つ」「指す」が合っているかを見る

1回分で十分です。 ここで確かめたいのは、「決まりで作った組が、世話役の組とどれくらい合うか」と、「記号を渡せば会所らしい連絡になるか」の2つです。

出てきた内容判断
決まりで作った組が世話役の組とほぼ合うApps Script で組分けを組む段階に進む
合わない組が多い世話役の判断を決まりのシートに書き出すのが先。 AIの問題ではない
文面が相手の強さを書いた指示に禁止の例を足すと直る。検査で拾う前提で進めてよい

2行目が出たときこそ、この段階の値打ちです。 合わなかった組について世話役に理由を聞くと、頭の中にあった決まりが言葉になります。 それを決まりのシートに書くことが、第14章の最初の作業です。

08実装時につまずきやすいポイント

問題対策
AIが相手の強さや棋風を書く指示で禁じ、語の検査で拾う
組合せの記号が文面から抜けるused_placeholders を組の人数と突き合わせる
昇段した会員の手合が古い名簿の「段級位を直した日」を見て確認を出す
世話役の事情が決まりに無い「同じ組にしない組み合わせ」のシートに会員番号だけ入れる
組を直している途中で文面ができる確定の印の次の朝に動かす
将棋の会員に「打つ」と書くgame を渡し、語の検査で拾う
スキーマが受け付けられないすべてのフィールドを required に、additionalProperties: false にする
全会員への申込の案内で送信の上限に当たる囲碁と将棋で日をずらすか、Google Workspace にする
トリガーの時刻がずれる分はランダム。時刻ちょうどの前提にしない

上の2行が、この構成の失敗のほとんどです。 どちらも文面の中の問題で、検査で拾える形にしておけば、世話役が全文を読まなくても見つかります。

3行目と4行目は、組合せそのものの失敗です。 AIとは関係なく、名簿と決まりのシートの付け方で決まります。 例会の後に結果を入れる日に、名簿の段級位の確認も同じ手順に入れておくと、最初の数か月で目立って減ります。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 会員の氏名・メールアドレス・電話番号、段級位、対局の結果、同じ組にしない会員の組み合わせです。

  1. AIに渡すのは記号と状況の名前だけにする … 会員の氏名、相手の名前、段級位、勝敗は渡しません。宛名と組合せは Apps Script が差し込みます
  2. store を false にする … Responses API は store が true のとき、アプリの状態を既定で30日保持するとされています
  3. 「同じ組にしない組み合わせ」に理由を書かない … 会員番号の組だけを入れ、シートの共有を席主と世話役に限ります。掲示用の表には、この決まりのシートの中身が出ないようにします
  4. 送るのは確認の印の後にする … AIの文面がそのまま会員に届く経路を作りません
  5. 子どもの会員を受けるときは生成AIの規約を確かめる … この構成は成人の会員を前提にしています。子どもの教室を始めるときは、使う生成AIの利用の条件を先に確かめてください
  6. API のキーをスクリプトに書かない … スクリプトのプロパティに置きます

誤りが起きた場合のリスクは、組合せや手合を違えて伝えることと、会員どうしの評判になる一言を送ることの2つです。 前者は名簿の付け方とAIの写し間違いで起き、後者はAIの気の利かせすぎで起きます。どちらも、組合せを記号で差し込み、相手を評する語を検査で止める設計で守ります。

10まず何から始めるか

1週目:手合の表と組分けの決まりを書き出す

席主の手合の表をシートに写し、世話役に組分けで気を付けていることを聞き取って、組分けの決まりのシートに書きます。名簿に「段級位を直した日」の列を足します。

2週目:1回分で試す

第8章のとおり、先月の例会1回分の組を手で作り、世話役の組と見比べます。合わなかった組の理由を聞いて、決まりのシートに足します。 ChatGPT の画面で5人分の文面を作り、会所らしいかを見ます。

3週目:申込と組分けを組む

申込のフォームを作り、Apps Script で組分けと手合の計算を作ります。生成AIをつながずに、確認のシートに組合せの表が出るところまで作り、席主が見て直します。

4週目:文面と送信をつなぐ

OpenAI API を呼んで文面を作り、記号を置き換えて検査し、送ります。最初の例会は、世話役が全員分の文面を全文読みます。

2か月目以降: 席主が直した箇所を例会ごとに数え、決まりのシートに足します。席主が組合せの表で直す箇所がほとんど無くなり、世話役が休んだ月でも例会の連絡が届いた時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-29/最終更新:2026-10-29
確認した内容情報源確認日
インストール型のトリガーが作った人のアカウントで動くこと。時刻が少しランダムになり、9時のトリガーが9〜10時に動き日ごとに保たれること。失敗時に「Summary of failures for Apps Script」のメールが届くことGoogle for Developers: Installable triggers2026-10-29
atHour()・everyDays() の指定。nearMinute() は前後15分で、呼ばないと分がランダムになることGoogle for Developers: ClockTriggerBuilder2026-10-29
メールの受信者の数が個人のアカウントで1日100、Google Workspace で1日1,500であることGoogle for Developers: Quotas for Google Services2026-10-29
GmailApp でメールを送れ、name・replyTo のオプションがあり、https://mail.google.com/ の権限が要ることGoogle for Developers: Class GmailApp2026-10-29
Structured Outputs が与えた JSON Schema に沿った応答を返すこと。Responses API では text.format に type: "json_schema"・strict: true を指定すること。すべてのフィールドを required にし additionalProperties: false が要ること。応じなかったときに refusal のフィールドが入ることOpenAI API: Structured model outputs2026-10-29
API に送ったデータは明示的に共有を選ばない限り学習・改善に使われないこと。Responses API は store が true のときアプリの状態を既定で30日保持することOpenAI API: Data controls in the OpenAI platform2026-10-29

手合の決め方、組分けの決まり、段級位の認定は、会所の決まりとして席主が決めてください。 本記事は公開されている仕様で確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-2297)についてのご相談はこちらから。

AI活用について相談する
目次