尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A simple web app for a shared mess (about 10 members): daily meals, bazar (grocery) costs, deposits, bazar and washroom-cleaning duties, and bazar memo photos. It runs on Google Apps Script and keeps all data in your own Google Sheet — no server, no cost. • Two meals a day: ☀️ lunch and 🌙 dinner (guests count as extra meals) • Works well on phones; can also run on a nicer Vercel link A + balance means the member gets money back; − means they still have to pay. "Cash with manager" = total deposits − costs paid from the mess fund.檢視完整 README ↗
A simple web app for a shared mess (about 10 members): daily meals, bazar (grocery) costs, deposits, bazar and washroom-cleaning duties, and bazar memo photos. It runs on Google Apps Script and keeps all data in your own Google Sheet — no server, no cost.
| What | Member | Manager | Admin |
|---|---|---|---|
| Ask for an account from the login page (anyone) | ✅ | ✅ | ✅ |
| Switch own meals on/off (one tap on Home) | ✅ | ✅ | ✅ |
| Upload a bazar memo photo | ✅ | ✅ | ✅ |
| Mark own duty as done | ✅ | ✅ | ✅ |
| See the monthly report, expenses and duties | ✅ | ✅ | ✅ |
| Enter / fix everyone's meals for any day | – | ✅ | ✅ |
| Add / edit expenses and deposits | – | ✅ | ✅ |
| Review memos (approve / reject) | – | ✅ | ✅ |
| Make bazar and cleaning rosters | – | ✅ | ✅ |
| Add members, approve account requests, set roles, reset passwords | – | – | ✅ |
| Settings (meal cut-off times etc.) | – | – | ✅ |
Meal rate = total bazar cost of the month ÷ total meals of the month
Meal cost = your meals × meal rate
Shared share = total shared costs (gas, maid, electricity...) ÷ number of members
Paid = cash deposits + bazar you paid from your own pocket
Balance = paid − (meal cost + shared share)
A + balance means the member gets money back; − means they still have to pay. "Cash with manager" = total deposits − costs paid from the mess fund.
Make a Google Sheet — open sheets.new and give it a name, e.g. Mess Accounts.
Paste the code — in the Sheet open Extensions → Apps Script. Delete everything in Code.gs, paste the whole of deploy/Code.gs (on GitHub: open it → Raw → Ctrl+A, Ctrl+C) and press Ctrl+S.
Deploy — Deploy → New deployment → ⚙️ Web app, set Execute as: Me and Who has access: Anyone, press Deploy and allow the permissions (if you see "Google hasn't verified this app": Advanced → Go to … (unsafe) → Allow — it is your own script).
Open the Web app URL and create the admin account. The sheets, the Drive folder for memo photos and the nightly auto-meal job are set up automatically.
Add members — either way works:
Give one person the Manager role. (To limit spam, at most 10 requests per hour and 20 waiting requests are accepted.)
⚠️ Create the admin account before sharing the link — until then, whoever opens it first can become admin. "Anyone" access is safe after that: nothing can be seen without logging in, and only you can open the Sheet.
Paste the new deploy/Code.gs, save, then Deploy → Manage deployments → ✏️ Edit → Version: New version → Deploy.
This keeps the same URL. Making a New deployment creates a new URL, and the old links (and the Vercel site) stop getting updates.
The page is served from Vercel, while all data still comes from your Google Sheet (through the Apps Script doPost API).
public/config.js — you can edit it directly on GitHub (✏️ icon). Only change the text between the quotes.vercel.json points Vercel to public/).If the Apps Script URL ever changes, just edit public/config.js again — Vercel redeploys by itself.
Members
Manager
Bazar (goes into the meal rate) or Shared (split equally).| Sheet | Contents |
|---|---|
Users | members, roles, password hashes (never plain passwords), default meals |
Meals | one row per member per day: lunch, dinner |
Expenses | bazar / shared, who paid (paidBy empty = mess fund) |
Deposits | money paid in |
Duties | bazar (bazar) and cleaning (clean) duties |
Memos | uploaded memos and their status (pending/approved/rejected) |
Settings | mess name, meal cut-off times, max meals per slot |
Do not change the header row or the column order. Memo photos are kept in the Drive folder
Mess Memo Images; they are not shared publicly — the app shows them itself.
deploy/Code.gs ⭐ the whole app in one file — paste this into Apps Script
public/index.html the same app for Vercel (generated), loads public/config.js
public/config.js the Apps Script Web App URL used by the Vercel site (edit by hand)
public/logo.png browser-tab / home-screen icon (also used by Apps Script via GitHub raw URL)
assets/ logo: original photo and square crops
vercel.json tells Vercel to serve public/
tools/build.js builds deploy/Code.gs and public/index.html from apps-script/
apps-script/ source files
Code.gs doGet/doPost, API router, optional setup()
Db.gs Google Sheet helpers, settings, dates
Auth.gs login, tokens, passwords, members
Meals.gs meals, cut-off times, nightly auto-meal job
Finance.gs expenses, deposits, memos and photos (Drive)
Duties.gs bazar and cleaning duties, rosters
Report.gs monthly report and home dashboard
Index.html page structure
Logo.html the logo as an embedded image (data URI, from assets/logo-192.jpg)
Styles.html design (mobile + dark mode)
JsCore.html API calls, login, navigation, sharing logins
JsPages.html Home, My meals, Memos, Duties, Report, Profile
JsManage.html Meal entry, Expenses, Deposits, Memo review, Members, Settings
appsscript.json manifest (only needed when using clasp)
After changing anything in apps-script/, run:
node tools/build.js
Using clasp instead of copy-paste: create .clasp.json with { "scriptId": "<SCRIPT_ID>", "rootDir": "apps-script" }, then clasp login and clasp push.