会員マスター(Googleスプレッドシート)ご要望のとおり、会員データの置き場所はスプレッドシートです

会員マスターは、これまで使い慣れたスプレッドシートのまま。

登録・更新・来園記録は、ここに1行ずつ自動で入ります。下の画面はスプレッドシートのイメージで、7,000人ぶんのデータが入っています。登録や読み取りを試すと、この表にも反映されます。

おおがファーム_会員マスター★ ドライブ › デジタル年間パス
共有
ファイル編集表示挿入表示形式データツールヘルプ
A1
fx

7,000人でも軽快

スプレッドシートの上限(1,000万セル)に対し、会員7,000人は約7万セル。余裕があります。来園ログは年度ごとに別ファイルへ保存すれば、ずっと軽いままです。

スタッフが直接編集もOK

「備考」の追記や、期限の手動調整も、スプレッドシートで直接できます。関数(例:期限切れの色分け)もそのまま使えます。

閲覧できる人を限定

共有は園のスタッフのGoogleアカウントだけに限定します。電話番号などの個人情報を守るため、一般公開はしません。

Apps Script — コード.gs(抜粋)
/** LINE会員証・ゲート・受付からのリクエストを受ける入口 */
function doPost(e) {
  const req = JSON.parse(e.postData.contents);
  switch (req.action) {
    case 'link':     return json_(linkLine_(req.lineUserId, req.phone, req.code));
    case 'checkin':  return json_(checkIn_(req.token));
    case 'lookup':   return json_(lookupByPhone_(req.phone));
    case 'register': return json_(registerMember_(req));
  }
}

/** ゲートでQRを読み取ったときの判定 */
function checkIn_(token) {
  const lock = LockService.getScriptLock(); lock.waitLock(10000);   // 同時読み取りでも行が重ならない
  try {
    const [, no, slot, sig] = token.split('.');
    if (sign_(no, slot) !== sig)            return { ok: false, reason: 'forged' };   // 偽造QR
    if (nowSlot_() - Number(slot) > 2)      return { ok: false, reason: 'stale' };    // スクリーンショット
    const m = findMember_(no);                // 会員マスターを検索(CacheServiceで高速化)
    if (!m)                                return { ok: false, reason: 'notfound' };
    if (isClosedDay_(new Date()))          return { ok: false, reason: 'closed' };   // 設定シートの休園日
    if (m.expiry < startOfToday_())         return { ok: false, reason: 'expired', member: m };
    logVisit_(m);                            // 「来園ログ」シートへ1行追記(日時・会員番号・ゲート)
    return { ok: true, member: m };
  } finally { lock.releaseLock(); }
}
実際には、この部分をおおがファーム様のGoogleアカウント内に設置します。上記は動きのイメージです。