Solo Consult Booking Kit — 個人開業向け初回相談予約システム
⚠️ 最初にお読みください — HIPAAの前提条件(構築を始める前に)
このシステムは、Business Associate Agreement(BAA)に署名済みのGoogle Workspaceアカウント内で実行される場合にのみ、HIPAAをサポートします。以下のすべてが満たされるまで、構築、デプロイ、または実際のクライアントデータを入力しないでください。
- Google Workspace(Business Starter、Standard、Plus、または同等の対象エディション)を開業用の独自ドメインで使用していること。無料の個人Gmailアカウント(
@gmail.com)は不可。 個人アカウントには署名可能なBAAがなく、このシステムやそのデータを保持してはなりません。 - Google Workspace BAAに署名済みであること。 Google管理コンソール(管理 → アカウント → 法務 / 「Business Associate Amendment」— メニュー名は変更される可能性あり)で、Google Workspace / Cloud IdentityのBAAを確認し同意し、その日付を記録してください。署名はWorkspace管理者による1回限りのクリックスルーです。見つからない場合は、まずそれを解決してください — カバーされていると仮定して先に進まないでください。
- すべてがそのWorkspaceアカウント内に存在すること。 Apps Scriptプロジェクト、予約スプレッドシート、相談を受け付けるカレンダー、確認メールを送信するメールボックスはすべて、同じWorkspaceユーザー(あなた)に属している必要があります。個人のGoogleアカウントでこのシステムの一部を実行したり、予約を個人のカレンダーにポイントしたりしないでください — 個人アカウントはBAAの対象外です。
- アカウントの強化が有効であること: アカウントに2段階認証プロセスを適用(パスキー / 高度な保護プログラムが推奨)、パスワードマネージャーで強力でユニークなパスワードを使用、自分が管理できる復旧オプションを設定していること。
ソフトウェアは「HIPAA認証」を受けることはできず、このキット自体が開業をHIPAA準拠にするものではありません。これはHIPAAをサポートする保護手段(データ最小化、ハッシュ化された期限付き管理リンク、汎用カレンダーイベント、保持スイープ、監査ログ — references/security-and-hipaa.md を参照)を備えて構築されており、BAAに署名するベンダー(Google)上で実行されます。コンプライアンスには、独自のリスク分析、ポリシー、トレーニング、およびプライバシー慣行に関する通知も必要です。上記の前提条件が1つでも欠けている場合、エージェントの最初の仕事は、アプリを構築することではなく、オーナーがそれを修正するのを支援することです。
目的
個人開業の臨床医に、グループ開業で使用される予約システムを、グループの仕組みなしで提供します。
- パートA — 公開予約アプリ。 開業ウェブサイトに埋め込まれた公開ウェブページで、見込みクライアントが簡単な適合性チェック(州、支払い方法、相談対象者、言語)に回答し、実際の空き枠(宣言された診療時間から実際のカレンダーの予定、休暇、既存の予約を差し引いたもの)のみを確認し、無料の初回相談(デフォルト15分、設定可能)を予約できます。クライアントには確認メール(
.icsファイルとプライベートな再スケジュール/キャンセルリンク付き)が送信され、あなたには最小限の通知が届きます。リマインダー(約24時間前)と相談後フォローアップはタイマーで実行されます。 - パートB — オーナーコンソール(1つのアプリ、3つのビュー)。 あなただけが使用する、PINで保護されたプライベートアプリ。グループ開業では3つのアプリに分割されている機能を統合します:
- 自分の相談 — 今後の / 過去の / キャンセルされた相談、クリックで詳細表示、過去の相談を無断キャンセルとしてマーク。
- 空き状況 — 週単位の診療時間(分割曜日対応可能)、日付固有の時間、休暇、新規クライアント受付のオン/オフ、予約設定(1回の相談頻度上限、最低通知時間、バッファー、枠の刻み)。解決済みの空き状況と、予約ページが計算するのと同じ方法で計算された今後7日間の空き枠を表示します。
- 設定とツール — コードに触れずにすべてのメールテンプレートと予約ルールを編集、予約統計と監査証跡を表示、監査/予約CSVをエクスポート(管理トークンはエクスポート不可)。
リファレンス実装:1つのスプレッドシートとあなた自身のGoogleカレンダーをバックエンドとする2つのGoogle Apps Scriptウェブアプリ。サードパーティの予約サービス、分析、トラッカーは一切使用しません。
個人開業版で意図的に削除したもの(グループ → 個人)
- 「カレンダーを接続」アプリはありません。 グループ開業では、このアプリは1つの理由で存在します。各プロバイダーが自分自身としてサインインし、自分のカレンダーを「イベントを変更」権限で開業の中央アカウントと共有し、カレンダーIDを予約システムに登録するためです。個人開業のオーナーはスクリプトのオーナーでありカレンダーのオーナーでもあります — 予約アプリはすでにあなたとして実行され、あなたのカレンダーに対するオーナーアクセス権を持っています。共有するものも登録するものもありません。セットアップは単に、カレンダーのIDをConfigタブに入力し(プライマリカレンダーのIDは単にあなたのメールアドレスです。または、同じWorkspaceアカウントに専用の「初回相談」カレンダーを作成し、そのIDを使用します)、組み込みの
checkSetup()を実行してaccessRole=ownerとfreebusy=OKを報告することを確認するだけです。 - プロバイダーロスターのワークブックとロスター同期はありません。 1人の臨床医 = 名前、資格情報、ライセンス州、パネル、言語、対応年齢、スライディングスケールフラグ、バイオリンク、タイムゾーン、カレンダーIDを保持する1つのConfig行。同期ジョブは不要で、プロバイダーIDを他の誰かに渡すこともありません。
- プロバイダーマッチング/ルーティングエンジンはありません。 グループのウィザードはクライアントを適切な臨床医にルーティングします。個人のウィザードはあなたに対する適合性のみをチェックします:間違った州、対応していないパネル、対応していない年齢層、またはスライディングスケールが必要なのに利用できない場合 → あなたの連絡先メールアドレスを記載した明確な非適合メッセージを表示し、行き止まりにはなりません。
- マルチプロバイダー関連は一切ありません: 共有ロスターにプロバイダー別のPINはない(1つのオーナーPIN、ハッシュ化され、Configタブに保存)、「代理編集」はない、プロバイダーフィルターはない、開業全体の休暇はない(あなたの休暇は単にあなたの休暇です)。
エージェントへの受け渡し(このキットを受け取る同僚へ)
このキットはプラットフォームに依存しません:プレーンなMarkdown(オープンなAgent Skills形式)であり、任意の有能なAIエージェント(スキルをロードするエージェント、ワークスペースを持つコーディングエージェント、ファイルをアップロードしたチャット専用エージェント)で動作します。このフォルダの README.md にプラットフォームごとの指示があり、PROMPT.md にコピー&ペースト可能なスタータープロンプトがあります。どちらのルートも同じ場所にたどり着きます:
- 上部のHIPAA前提条件(Workspace + 署名済みBAA + 強化)が満たされていることを確認します。満たされていない場合は、最初にそれを行います。
- 以下のセットアップインタビューに回答します — エージェントは構築前に一度だけ質問する必要があります。
- エージェントに両方のアプリを構築およびテストさせ、
references/test-checklist.mdのテストチェックリストをテスト予約で実行させ、その後でのみ公開リンクを新しい予約ページに切り替えます。
テストチェックリストがエンドツーエンドで合格するまで、既存の予約リンク(ある場合)はフォールバックとして有効のままにしておきます。
これを構築するエージェントへの指示(任意のプラットフォーム)
- 類似システムの記憶ではなく、これらのファイルから作業してください。 コードを書く前に、このファイルとすべてのリファレンスを読んでください。リファレンスとオーナーの実際の指示が矛盾する場合は、オーナーの指示が優先され、その変更は文書化されます。
- 成果物はファイル + 検証済みの手順です(使用するツールに関係なく)。 各プロジェクトを貼り付け可能なファイル(該当する場合は
Code.gs、Index.html、Manage.html、appsscript.json)として生成します。オーナーのGoogleアカウントまたはApps Script API/デプロイパスに直接アクセスできる場合は、デプロイしても構いません — ただし、オーナーの事前承諾を得た場合のみで、配信された結果からも検証する必要があります。そのアクセス権がない場合(ほとんどのチャットエージェントはありません)、ファイルを引き渡し、references/setup-and-deploy.mdをクリックごとにオーナーに案内してください。Googleサインイン、スコープ承認、デプロイアクションはオーナーが行うものであり、それらを実行できないエージェントは、デプロイしたと暗示するのではなく、その旨を率直に伝えるべきです。 - 本番環境が使用する形でテストしてください。 スプレッドシート/カレンダーレイヤーをスタブ化し、出荷されるクライアントが送信するのとまったく同じ引数形式ですべてのサーバー関数を呼び出すローカルハーネスを構築します。コード変更のたびに、最後だけでなく実行します。
- ベンダー固有の機能を決して必要としないでください。 ここにあるものはすべて、Google Apps Script + Sheets + Calendar + Gmail に Markdown を加えたものです。あなたのプラットフォームが便利な機能(デプロイ統合、ファイルツール)を提供する場合はそれを使用しても構いませんが、ビルドがそれに依存してはなりません — 同じキットが別のエージェントを使用する次のオーナーでも動作する必要があります。
セットアップインタビュー(一度収集し、書き留め、決して推測しない)
- 前提条件: Workspaceドメイン、すべてを所有するアカウント(例:[email protected])、署名済みBAA(日付)、2段階認証プロセス有効。
- 開業情報: 開業名、クライアントに表示されるあなたの名前 + 資格情報、開業連絡先メールアドレス、通知用メールアドレス(同じでも可)、ウェブサイトURL、プライバシーポリシーURL。
- カレンダー: プライマリカレンダー、または同じアカウント内の専用相談カレンダー?そのIDをConfigに入力します。(推奨:専用カレンダー — 相談イベントが視覚的に分離され、メインカレンダーの内容を公開せずにそのカレンダーの空き時間情報を共有できます。どちらの場合も、アプリは空き時間のみを読み取り、汎用の相談イベントのみを作成します。)
- 適合プロファイル(ウィザードの支払い/適格性オプションを駆動 — Configから生成され、ページにハードコードされません): ライセンスを保有している州;受け入れている保険パネル、EAP、および基金(クライアント向けの正確な名称);自己負担とスライディングスケール(はい/いいえ、および公に使用する最低料金の表現);セラピーを提供する言語;対応するクライアント(成人 / 10代 / 子ども / カップル / 家族);米国外に居住するクライアントを診るかどうか(はいの場合:相談は無料のままですが、継続的なセラピーは自己負担/スライディングのみ — ウィザードは支払いオプションをそれに応じて制限します)。
- 予約ルール(リファレンスシステムのデフォルト — 確認または変更): 相談時間 15分;予約可能期間 14日;最低通知時間 12時間;枠の刻み 30分ごと;予定の前後のバッファー 10分;再スケジュール/キャンセル期限 4時間前;リマインダー 24時間前;相談後フォローアップ 相談終了5分後;クライアントのメール/電話番号あたり1つのアクティブな相談(重複防止ガード有効)。
- 初期設定の空き状況: 初期の週単位の診療時間 + タイムゾーン。これにより、初日からページに実際の枠が表示されます。(その後はコンソールでこれらを管理します。)
- メールの文言: 確認、リマインダー、フォローアップのテンプレート(トークン例:
{ClientFirstName}、{EventDateTime}、{ProviderName});フォローアップメールがリンクするアンケート / 次のステップのリンク;送信者名/アドレス(あなたのアドレス、またはアカウントのエイリアス(例:[email protected])— エイリアスには追加のOAuthスコープが1つ必要です。デプロイリファレンスを参照してください)。 - ブランディング: 公開ページのウェブサイトの外観(フォント、テキストの色、ボタン/リンクのアクセントカラー、角のスタイル)。公開ページはフラットなウェブサイトスタイルを使用します — ポータルガラス/オーロラ、Googleブランディング、ネイティブブラウザダイアログは使用しません。
- 言語: 英語のみ、またはバイリンガル?リファレンスシステムは第2の完全な言語(1セットの翻訳された質問、クライアントが予約した言語でのメール)をサポートします。実際にその言語でクライアントに対応する場合のみ追加してください。
- プライバシー通知: クライアントが承認する必要がある簡単な予約フォームのプライバシー文言(収集するもの、緊急時にメールが監視されないこと、危機対応ホットライン 988 / 911(米国の場合))。すべての予約は、承認タイムスタンプ + 通知バージョンを保存します。文言が変更されるたびにバージョン文字列を更新します。
全体的な連携(1段落)
両方のアプリは、あなたのWorkspaceアカウント内であなた(USER_DEPLOYING)として実行されます。予約アプリは公開されており匿名です。訪問者はスプレッドシートやカレンダーの詳細を一切見ることはありません — 空き状況は空き時間情報のみから計算されます。スクリプトロックの下で行われた予約(2人の訪問者が同じ枠を取れないようにする)は、Appointmentsタブに1行書き込み、あなたのカレンダーに汎用タイトルのイベント(「初回相談 — 」、最小限の説明、クライアントの参加者はなし)を作成し、クライアント(確認 + .ics + プライベート管理リンク、トークンはSHA-256ハッシュとしてのみ保存)とあなた(トリアージ最小限、件名にクライアント名なし)にメールを送信します。5分間のタイマーがリマインダーとフォローアップを送信し、保持スイープを実行します。コンソールはPINで保護されており、同じワークブックを読み書きし、完全な予約詳細が表示される唯一の場所です。完全なデータモデルと優先順位ルール:references/architecture.md。
構築順序(順序を変更しないでください)
- ワークブック + 予約アプリ
references/booking-app-spec.mdとreferences/setup-and-deploy.mdに従って(シートを作成し、setupSheet()、checkSetup()、setupTriggers()を実行し、デプロイ)。 - コンソールアプリ
references/console-app-spec.mdに従って(PINゲート、自分の相談、空き状況、設定とツール)、同じワークブックに対して。 - テスト
references/test-checklist.mdを使用 — 実際のエンドツーエンドのテスト予約、二重予約の試行、電子メールで送信されたリンクによる再スケジュール/キャンセル、非適合パス、手動によるリマインダー/フォローアップ。 - 公開: 予約アプリをウェブサイトの予約ページに埋め込み、公開リンクを交換し、実際の予約を正常に受け付けるまで古いリンクをフォールバックとして保持します。
エージェントのための厳格なルール(これらは高くつく教訓です)
- スコープ: コードが
SpreadsheetApp.openByIdを呼び出す場合は常に、完全なhttps://www.googleapis.com/auth/spreadsheetsスコープを宣言してください — 読み取り専用スコープはそのような呼び出しをすべてスローします。アプリが GmailApp と MailApp の両方でメールを送信する場合は、両方のgmail.sendとscript.send_mailを宣言してください(gmail.sendだけでは MailApp をカバーせず、失敗は try/catch に飲み込まれ、メールは静かに送信されません)。GmailApp を介して「送信者名として」エイリアスから送信するには、gmail.settings.basicも必要です。カレンダー機能では、マニフェストで Calendar Advanced Service(v3)を有効にする必要があります。 - デプロイ: 最初のデプロイ後は、常に既存のデプロイを新しいバージョンにバンプしてください。新しいデプロイを作成しないでください — 新しいURLはすべての埋め込みとリンクを壊し、古いURLは古いコードを提供し続けます。デプロイされたコンテンツを読み返し/提供されたマークアップを確認します...