๐ ้ฃไนฆๆๆกฃๅพ ๅ่ชๅจ่ฏๅซ
/install feishu-doc-todo
feishu-doc-todo ๆ่ฝ
ๆ่ฟฐ
้ฃไนฆๆๆกฃๅพ ๅ่ชๅจ่ฏๅซไธๆฅๅๅๅปบๅทฅๅ ทใ่ชๅจ่ฏปๅ้ฃไนฆๆๆกฃไธญ็ๅพ ๅ่กจๆ ผ๏ผๆถ้ด่็น + ้็จ็ข + ่ด่ดฃไบบ๏ผ๏ผ่งฃๆๆจก็ณๆถ้ด๏ผๅๅปบ้ฃไนฆๆฅๅๆฅ็จๅนถ่ฎพ็ฝฎ deadline ๆ้ใ
่งฆๅ่ฏ
- "ๅๅปบๆฅๅ"
- "่ฎพ็ฝฎๆฅ็จ"
- "ๅพ ๅๆ้"
- "deadline ๆ้"
- "้ฃไนฆๆๆกฃๅพ ๅ"
- "ๆๆกฃๅพ ๅ่ฝฌๆฅๅ"
ๆง่กๆต็จ
ๆญฅ้ชค 1๏ผ่ฏปๅ้ฃไนฆๆๆกฃๅ ๅฎน
ไฝฟ็จ feishu_doc read ่ฏปๅๆๆกฃๅ
ๅฎน๏ผๆๅๅพ
ๅ่กจๆ ผใ
# ่ฏปๅๆๆกฃ
feishu_doc read --doc_token \x3Cๆๆกฃ token>
ๅพ ๅ่กจๆ ผๆ ผๅผ่ฏๅซ๏ผ
| ๆถ้ด่็น | ้็จ็ข | ่ด่ดฃไบบ |
|---------|--------|--------|
| ไธๅจ | xxx | xxx |
| 4 ๆ 8 ๆฅ | xxx | xxx |
| 4 ๆไปฝ | xxx | xxx |
ๆญฅ้ชค 2๏ผ่งฃๆๅพ ๅไบ้กน
Python ่งฃๆ่ๆฌ๏ผ
import re
from datetime import datetime, timedelta
def parse_todo_table(markdown_table):
"""่งฃๆๅพ
ๅ่กจๆ ผ๏ผ่ฟๅๅพ
ๅไบ้กนๅ่กจ"""
todos = []
# ่งฃๆ่กจๆ ผ่ก
lines = markdown_table.strip().split('\
')
headers = []
data_rows = []
for i, line in enumerate(lines):
if i == 0: # ่กจๅคด
headers = [h.strip() for h in line.split('|')[1:-1]]
elif i == 1: # ๅ้็บฟ
continue
else: # ๆฐๆฎ่ก
cells = [c.strip() for c in line.split('|')[1:-1]]
if len(cells) >= 3:
data_rows.append({
'time': cells[0],
'task': cells[1],
'owner': cells[2]
})
return data_rows
def parse_fuzzy_time(time_str, reference_date=None):
"""่งฃๆๆจก็ณๆถ้ดไธบๅ
ทไฝๆฅๆ"""
if reference_date is None:
reference_date = datetime.now()
time_str = time_str.strip()
# ็ฒพ็กฎๆฅๆ๏ผ4 ๆ 8 ๆฅ
match = re.match(r'(\d{1,2}) ๆ (\d{1,2}) ๆฅ๏ผ', time_str)
if match:
month, day = int(match.group(1)), int(match.group(2))
year = reference_date.year
return datetime(year, month, day)
# ๆจก็ณๆถ้ด๏ผไธๅจ
if 'ไธๅจ' in time_str:
return reference_date + timedelta(days=7)
# ๆไปฝ๏ผ4 ๆไปฝ
match = re.match(r'(\d{1,2}) ๆไปฝ', time_str)
if match:
month = int(match.group(1))
# ๅๆไธญ
return datetime(reference_date.year, month, 15)
# ้ป่ฎค๏ผ่ฟๅๅ่ๆฅๆ +7 ๅคฉ
return reference_date + timedelta(days=7)
# ไฝฟ็จ็คบไพ
todos = parse_todo_table(table_markdown)
for todo in todos:
deadline = parse_fuzzy_time(todo['time'])
print(f"ไปปๅก๏ผ{todo['task']}")
print(f"่ด่ดฃไบบ๏ผ{todo['owner']}")
print(f"ๆชๆญขๆฅๆ๏ผ{deadline.strftime('%Y-%m-%d')}")
print("---")
ๆญฅ้ชค 3๏ผๅๅปบ้ฃไนฆๆฅๅๆฅ็จ
ไฝฟ็จ feishu_calendar create ๅๅปบๆฅ็จใ
# ๅๅปบๅไธชๆฅ็จ
feishu_calendar create \
--title "ใๅพ
ๅใxxx" \
--start_time "2026-04-05T09:00:00+08:00" \
--end_time "2026-04-05T18:00:00+08:00" \
--attendees "XXX" \
--description "้็จ็ข๏ผxxx\
่ด่ดฃไบบ๏ผXXX\
ๆฅๆบๆๆกฃ๏ผhttps://XXX" \
--reminder_minutes 1440
ๅๆฐ่ฏดๆ๏ผ
| ๅๆฐ | ๅผ | ่ฏดๆ |
|---|---|---|
--title |
ใๅพ ๅใ+ ้็จ็ข | ๆฅ็จๆ ้ข |
--start_time |
ISO8601 ๆ ผๅผ | ๆฅ็จๅผๅงๆถ้ด๏ผๅ จๅคฉๅไธบ 09:00๏ผ |
--end_time |
ISO8601 ๆ ผๅผ | ๆฅ็จ็ปๆๆถ้ด๏ผๅ จๅคฉๅไธบ 18:00๏ผ |
--attendees |
่ด่ดฃไบบๅ่กจ | ๆฅ็จๅไธ่ |
--description |
่ฏฆ็ปไฟกๆฏ | ๅ ๅซ้็จ็ขใ่ด่ดฃไบบใๆฅๆบๆๆกฃ |
--reminder_minutes |
1440 | ๆๅ 1440 ๅ้๏ผ1 ๅคฉ๏ผๆ้ |
ๆญฅ้ชค 4๏ผๆน้ๅๅปบๆฅ็จ
ๆน้ๅค็่ๆฌ๏ผ
import subprocess
import json
from datetime import datetime
def create_calendar_event(todo, source_doc_url):
"""ๅๅปบๅไธชๆฅๅไบไปถ"""
deadline = parse_fuzzy_time(todo['time'])
# ๆๅปบๅฝไปค
cmd = [
'feishu_calendar', 'create',
'--title', f'ใๅพ
ๅใ{todo["task"]}',
'--start_time', deadline.strftime('%Y-%m-%dT09:00:00+08:00'),
'--end_time', deadline.strftime('%Y-%m-%dT18:00:00+08:00'),
'--attendees', todo['owner'],
'--description', f'้็จ็ข๏ผ{todo["task"]}\
่ด่ดฃไบบ๏ผ{todo["owner"]}\
ๆฅๆบๆๆกฃ๏ผ{source_doc_url}',
'--reminder_minutes', '1440' # ๆๅ 1 ๅคฉๆ้
]
# ๆง่กๅฝไปค
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
print(f"โ
ๅๅปบๆๅ๏ผ{todo['task']}")
return json.loads(result.stdout)
else:
print(f"โ ๅๅปบๅคฑ่ดฅ๏ผ{todo['task']}")
print(result.stderr)
return None
# ๆน้ๅๅปบ
source_doc = "https://XXX"
for todo in todos:
create_calendar_event(todo, source_doc)
ๅฎๆด็คบไพ
่พๅ ฅ
Thomas ๆถๆฏ๏ผ
ๅๅปบๆฅๅ๏ผไปไปฅไธๆๆกฃๆๅๅพ
ๅ๏ผ
https://XXX
ๆง่ก่ฟ็จ
1. ่ฏปๅๆๆกฃ๏ผ
feishu_doc read --doc_token XXX
2. ่งฃๆๅพ ๅ่กจๆ ผ๏ผ
todos = [
{
'time': 'ไธๅจ',
'task': 'xxx',
'owner': 'xxx'
},
{
'time': '4 ๆ 8 ๆฅ',
'task': 'xxx',
'owner': 'xxx'
},
{
'time': '4 ๆไปฝ',
'task': 'xxx',
'owner': 'xxx'
},
{
'time': '5 ๆๆ 6 ๆๅบ',
'task': 'xxx',
'owner': 'ๅ
จไฝ'
}
]
3. ่งฃๆๆถ้ด๏ผ
parse_fuzzy_time('ไธๅจ') โ 2026-04-05
parse_fuzzy_time('4 ๆ 8 ๆฅ') โ 2026-04-08
parse_fuzzy_time('4 ๆไปฝ') โ 2026-04-15
parse_fuzzy_time('5 ๆๆ 6 ๆๅบ') โ 2026-06-30
4. ๅๅปบๆฅๅ๏ผ
# ๅพ
ๅ 1
feishu_calendar create \
--title "ใๅพ
ๅใxxx" \
--start_time "2026-04-05T09:00:00+08:00" \
--end_time "2026-04-05T18:00:00+08:00" \
--attendees "xxx" \
--description "้็จ็ข๏ผxxx\
่ด่ดฃไบบ๏ผxxx\
ๆฅๆบๆๆกฃ๏ผhttps://XXX" \
--reminder_minutes 1440
# ๅพ
ๅ 2
feishu_calendar create \
--title "ใๅพ
ๅใxxx" \
--start_time "2026-04-08T09:00:00+08:00" \
--end_time "2026-04-08T18:00:00+08:00" \
--attendees "xxx" \
--description "้็จ็ข๏ผxxx\
่ด่ดฃไบบ๏ผxxx\
ๆฅๆบๆๆกฃ๏ผhttps://XXX" \
--reminder_minutes 1440
# ... ๅ
ถไปๅพ
ๅ
่พๅบ
ๅๅปบ็ปๆ๏ผ
โ
ๅๅปบๆๅ๏ผxxx (2026-04-05)
โ
ๅๅปบๆๅ๏ผxxx (2026-04-08)
โ
ๅๅปบๆๅ๏ผxxx (2026-04-15)
โ
ๅๅปบๆๅ๏ผxxx (2026-06-30)
ๆป่ฎก๏ผ4 ไธชๆฅ็จๅทฒๅๅปบ
ๆๆฏ้ ็ฝฎ
ๅ็ฝฎๆกไปถ
-
้ฃไนฆๅบ็จๆ้
- ้ฃไนฆๆๆกฃ่ฏปๅๆ้
- ้ฃไนฆๆฅๅๅๅปบๆ้
- ้ฃไนฆ่็ณปไบบ่ฏปๅๆ้๏ผ่งฃๆ่ด่ดฃไบบ๏ผ
-
ไพ่ต
- Python 3.8+
- OpenClaw 2026.3.13+
้่ฏฏๅค็
ๅธธ่ง้่ฏฏๅ่งฃๅณๆนๆก
้่ฏฏ 1๏ผๆๆกฃๆ ๅพ ๅ่กจๆ ผ
้่ฏฏ๏ผๆชๆพๅฐๅพ
ๅ่กจๆ ผ
่งฃๅณ๏ผๆฃๆฅๆๆกฃๆฏๅฆๅ
ๅซ"ๆถ้ด่็น | ้็จ็ข | ่ด่ดฃไบบ"ๆ ผๅผ็่กจๆ ผ
้่ฏฏ 2๏ผๆถ้ด่งฃๆๅคฑ่ดฅ
้่ฏฏ๏ผๆ ๆณ่งฃๆๆถ้ด"ไธไธชๆ"
่งฃๅณ๏ผๆทปๅ ๆดๅคๆจก็ณๆถ้ด่งฃๆ่งๅ๏ผๆๆๅจๆๅฎๆฅๆ
้่ฏฏ 3๏ผ่ด่ดฃไบบไธๅจ้่ฎฏๅฝ
้่ฏฏ๏ผ attendees "XXX" ไธๅจ้่ฎฏๅฝ
่งฃๅณ๏ผไฝฟ็จ้ฃไนฆ็จๆท ID ๆ open_id ไปฃๆฟๅงๅ
้่ฏฏ 4๏ผๆฅๅๅๅปบๅคฑ่ดฅ
้่ฏฏ๏ผๆ้ไธ่ถณ
่งฃๅณ๏ผๆฃๆฅ้ฃไนฆๅบ็จๆฏๅฆๆๆฅๅๅๅปบๆ้
ๆไฝณๅฎ่ทต
1. ๆถ้ด่งฃๆ่งๅไผๅ ็บง
| ไผๅ ็บง | ๆถ้ดๆ ผๅผ | ่งฃๆ่งๅ |
|---|---|---|
| 1 | ็ฒพ็กฎๆฅๆ๏ผ4 ๆ 8 ๆฅ๏ผ | ็ดๆฅไฝฟ็จ |
| 2 | ๆจก็ณ่ๅด๏ผไธๅจ๏ผ | ๅฝๅๆฅๆ +7 ๅคฉ |
| 3 | ๆไปฝ๏ผ4 ๆไปฝ๏ผ | ๅๆไธญ๏ผ15 ๆฅ๏ผ |
| 4 | ็ธๅฏนๆถ้ด๏ผไธๅจ๏ผ | ๅฝๅๆฅๆ +7 ๅคฉ |
2. ๆฅ็จๆ ้ข่ง่
ใๅพ
ๅใ+ ้็จ็ขๅ
ๅฎน
็คบไพ๏ผ
โ
ใๅพ
ๅใxxx
โ
ใๅพ
ๅใxxx
3. ๆ้่ฎพ็ฝฎ
| ็ฑปๅ | ๆๅๆถ้ด | ้็จๅบๆฏ |
|---|---|---|
| ้่ฆ้็จ็ข | 1440 ๅ้๏ผ1 ๅคฉ๏ผ | ๅ ณ้ฎ่็น |
| ไธ่ฌไปปๅก | 60 ๅ้๏ผ1 ๅฐๆถ๏ผ | ๆฅๅธธไปปๅก |
| ้ฟๆ้กน็ฎ | 10080 ๅ้๏ผ7 ๅคฉ๏ผ | ๆๅบฆ/ๅญฃๅบฆ็ฎๆ |
็ๆฌๅๅฒ
| ็ๆฌ | ๆฅๆ | ๅๆด |
|---|---|---|
| v1.0.4 | 2026-03-29 | ๆๆ TODO ๅ ๅฎนๅ จ้จๆฟๆขไธบ xxx๏ผไบง่ฝ่ฐ็ /็ณป็ปไธ็บฟ/ๆๆๅฑ็คบ็ญๅ จ้จ่ฑๆ๏ผ |
| v1.0.3 | 2026-03-29 | ๅฎๅ จ่ฑๆๆๆ็คบไพๆฐๆฎ๏ผไบบๅ/้กน็ฎๅ/้พๆฅๅ จ้จๆฟๆขไธบ XXX๏ผ |
| v1.0.2 | 2026-03-29 | ๅฎๅ จ้ๅๆง่ก่ฟ็จ็คบไพ๏ผๆๆๆๆไฟกๆฏๅทฒ่ฑๆไธบ XXX |
| v1.0.1 | 2026-03-29 | ไฟฎๅคๆๆไฟกๆฏๆณ้ฒ้ฎ้ข๏ผๆๆ็คบไพไบบๅๅ้กน็ฎๅ็งฐๅทฒ่ฑๆไธบ XXX |
| v1.0.0 | 2026-03-29 | ๅๅง็ๆฌ |
่ฎธๅฏ่ฏ
MIT License
็ปดๆค่
OpenClaw Community\r
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install feishu-doc-todo - After installation, invoke the skill by name or use
/feishu-doc-todo - Provide required inputs per the skill's parameter spec and get structured output
What is ๐ ้ฃไนฆๆๆกฃๅพ ๅ่ชๅจ่ฏๅซ?
่ชๅจ่ฏๅซ้ฃไนฆๆๆกฃไธญ็ๅพ ๅ่กจๆ ผ๏ผ่งฃๆๆจก็ณๆถ้ดๅนถๅๅปบๅฏนๅบ็้ฃไนฆๆฅๅๆฅ็จ๏ผๆฏๆ่ด่ดฃไบบๅๆ้่ฎพ็ฝฎใ It is an AI Agent Skill for Claude Code / OpenClaw, with 113 downloads so far.
How do I install ๐ ้ฃไนฆๆๆกฃๅพ ๅ่ชๅจ่ฏๅซ?
Run "/install feishu-doc-todo" in the OpenClaw or Claude Code chat to install it in one step โ no extra setup required.
Is ๐ ้ฃไนฆๆๆกฃๅพ ๅ่ชๅจ่ฏๅซ free?
Yes, ๐ ้ฃไนฆๆๆกฃๅพ ๅ่ชๅจ่ฏๅซ is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does ๐ ้ฃไนฆๆๆกฃๅพ ๅ่ชๅจ่ฏๅซ support?
๐ ้ฃไนฆๆๆกฃๅพ ๅ่ชๅจ่ฏๅซ is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created ๐ ้ฃไนฆๆๆกฃๅพ ๅ่ชๅจ่ฏๅซ?
It is built and maintained by icesumer-lgtm (@icesumer-lgtm); the current version is v1.0.4.