每天每個人只能簽到一次,
使用Google AppSheet Api 來新增內容,
如有重覆的資料,就不新增了。
在我們的試算表中的工具列 > 擴充功能 > AppSheet > 建立應用程式
按進去後就會看到以下的畫面,
在左邊的Data點選後,可以有一個新增一個Table,Table name 可以自己取,
但是在實驗過程中,因為怕程式無法取得中文,所以才改成英文。
基本上可以直接改試算表欄位,要有一個唯一值,也就是所有的欄位都可以重覆,但一定要有一個欄位只能是一個人有,而我的唯一值(KEY)是由 [ID + 時間] 組成
Name | Type | Key | Show | EDITABLE | SEARCH | FORMULA
---|---|---|---|---|---
_RowNumber | Number | N | N | Y | N | ""
ID | TEXT | N | Y | Y | Y | ""
日期 | DATE | N | Y | Y | Y | ""
時間 | DATETIME | N | Y | Y | N | ""
暱稱 | TEXT | N | Y | Y | Y | ""
_ComputedKey | TEXT | Y | Y | N | Y | CONCATENATE([ID],": ",[日期])
點選在左邊的Deploy ,往下劃, 點選 「Move app to deplyed state despite errors」,
當有綠色點點就表示完成了。
官方文件
使用 URL POST
googleAppSheet.py
import os
import requests
# google appsheet
def app_sheet_init(tableId, payload):
appId = os.getenv("GOOGLE_APPSHEET_ID")
url = f'https://api.appsheet.com/api/v2/apps/{appId}/tables/{tableId}/Action'
headers = {'ApplicationAccessKey': os.getenv("GOOGLE_APPSHEET_TOKEN")}
x = requests.post(url, headers=headers, json=payload)
return x.text
def app_sheet_find(tableId, selector):
return app_sheet_init(tableId, {
"Action": "Find",
"Properties": {
"Locale": "zh-tw",
"Selector": selector
},
})
def app_sheet_add(tableId, data):
payload = {
"Action": "Add",
"Properties": { "Locale": "zh-tw" },
"Rows": [ data ]
}
app_sheet_init(tableId, payload)
tool_checkin.py
def main(Bot):
name = "簽到"
print(f"{name} 註冊成功")
def check_in_data(member):
try:
now = moment.now().timezone("Asia/Taipei")
selector = f"FILTER('checkIn',([_ComputedKey] = '{str(member.id)}: {now.format('MM/DD/YYYY')}'))"
resultStr = app_sheet_find("checkIn", selector)
result = json.loads(resultStr)
if (len(result) > 0):
return "你今天已經簽到過了喔w😚"
else :
app_sheet_add("checkIn", {
"ID": str(member.id),
"日期": moment.now().format("YYYY/MM/DD"),
"時間": moment.now().format("YYYY/MM/DD HH:mm:ss"),
"暱稱": member.display_name
})
return "簽到成功✅"
except:
return "⚠️簽到失敗,請通知管理員處理"
@Bot.command(name=name)
async def check_in_form_command(ctx):
await ctx.send(check_in_data(ctx.author))
@Bot.slash_command(name=name, description="成員簽到")
async def check_in_from_slash_command(ctx):
await ctx.respond(check_in_data(ctx.author))