
一、背景需求
通知要求8月7日前把园园通新小班建班、幼儿分班、信息完善(待处理问题)完成。

为了取消标红,


我用了一个批量填写"假地址"的方法。确保标红的内容都被填全。


其他数据重要性不大,户籍地址是最重要的,必须要填写正确,目前"园园通"里面的外省户籍地址都是"待补充"
二、数据收集
因为幼儿纸质报名表上没有"外省户籍地址",只有外省(省),连外省(市)、外省(区)也没有。
组长说她可以马上向家长收集"户籍地址"


所以组长让小班组员去问家长要名单。

我用接龙管家做了一套





既然做了表单,我又添加一个"独生子女统计"


这个模版发给组长,让组员们复制。

小班组员们打电话来问:"我不会把里面的姓名改成我们班孩子,你能帮我改一下吗"
之前正好收集了18个班级姓名表单

里面有所有托班、小班的幼儿姓名、性别

我希望在幼儿姓名前面添加"学号",就在"共享表单"里,做一个学号和姓名的连接

复制整列"学号+姓名"

打开接龙管家模版

设置名单




把包含班级名字的接龙表单发给班主任,再抄送管理员权限


三、表单下载
组长速度最快

打开表单,里面有所有需要填写的项目




虽然其他信息也要修改(我都是默认选否、默认非农-城市)但最重要的是先修改"户籍地址"
从表格里看,我需要读取A列"姓名"和E列"户籍地址"


python
'''
园园通小班孩子分班后补全信息
1.外省户口孩子更新地址(只更新地址,把待更新改掉)
3.Python模拟鼠标点击园园通按钮,进行分班
4.前期已经3101搜索过了。
'''
import openpyxl
import pyautogui
import time
import pyperclip
import pygetwindow as gw
# 1. 找到VSCode窗口(匹配标题含 Visual Studio Code)
vscode_wins = gw.getWindowsWithTitle("Visual Studio Code")
if not vscode_wins:
print("未找到VSCode窗口,请先打开VSCode再运行!")
else:
win = vscode_wins[0]
# 自动最小化VSCode
win.minimize()
print("VSCode已自动最小化,你有5秒时间移动鼠标到目标位置")
time.sleep(5) # 等待5秒给你放鼠标
import random
# 随机休眠:1~3秒,带小数,模拟真人操作
def rand_sleep():
t = random.uniform(2, 3)
time.sleep(t)
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260805班级信息表.xlsx"
file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260806小1班圆圆通信息补全(1).xlsx"
wb = openpyxl.load_workbook(file_path)
# 读取表格
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
for row in ws.iter_rows(min_row=2, values_only=True): # 从第二行开始读取姓名
# for row in ws.iter_rows(min_row=24, values_only=True): # 如果出问题,断了,从第X行读取孩子姓名
if len(row) < 4:
continue
name = row[0]
if not name or str(name).strip() == "":
continue
address = row[4]
# class_name = row[1]
# garden_name = row[1]
# data_list.append([class_name, name])
print(name)
print(address)
# 点击姓名栏,
pyautogui.click(861,376)
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(name)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 搜索
pyautogui.click(758,497)
rand_sleep()
# 编辑
pyautogui.click(1652,671)
time.sleep(3)
# 模拟滚动到底部
pyautogui.click(1652,671)
for _ in range(2):
pyautogui.scroll(-1000)
rand_sleep()
# time.sleep(0.3) # 每滚轮一下间隔0.3秒
# 户籍地址点击三次
for i in range(3):
pyautogui.click(1404,473)
rand_sleep()
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(address)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 下移到底部
for _ in range(1):
pyautogui.scroll(-1000)
rand_sleep()
# 确认,回到最初的界面
pyautogui.click(1027,857)
time.sleep(5) # 保存时间长一点
# 自动最大化VSCode
win.maximize()
print("VSCode已自动最大化,程序结束")


因为幼儿信息保密,所以不能展示图片或视频。
反正我使用代码读取小1班的姓名,和对应地址,顺利将"待补充"批量改成"正确地址"


小3班老师也很快发来了接龙表单


表单路径修改一下


python
'''
园园通小班孩子分班后补全信息
1.外省户口孩子更新地址(只更新地址,把待更新改掉)
3.Python模拟鼠标点击园园通按钮,进行分班
4.前期已经3101搜索过了。
'''
import openpyxl
import pyautogui
import time
import pyperclip
import pygetwindow as gw
# 1. 找到VSCode窗口(匹配标题含 Visual Studio Code)
vscode_wins = gw.getWindowsWithTitle("Visual Studio Code")
if not vscode_wins:
print("未找到VSCode窗口,请先打开VSCode再运行!")
else:
win = vscode_wins[0]
# 自动最小化VSCode
win.minimize()
print("VSCode已自动最小化,你有5秒时间移动鼠标到目标位置")
time.sleep(5) # 等待5秒给你放鼠标
import random
# 随机休眠:1~3秒,带小数,模拟真人操作
def rand_sleep():
t = random.uniform(2, 3)
time.sleep(t)
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260805班级信息表.xlsx"
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260806小1班圆圆通信息补全(1).xlsx"
file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260806小3班圆圆通信息补全.xlsx"
wb = openpyxl.load_workbook(file_path)
# 读取表格
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
for row in ws.iter_rows(min_row=2, values_only=True): # 从第二行开始读取姓名
# for row in ws.iter_rows(min_row=24, values_only=True): # 如果出问题,断了,从第X行读取孩子姓名
if len(row) < 4:
continue
name = row[0]
if not name or str(name).strip() == "":
continue
address = row[4]
# class_name = row[1]
# garden_name = row[1]
# data_list.append([class_name, name])
print(name)
print(address)
# 点击姓名栏,
pyautogui.click(861,376)
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(name)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 搜索
pyautogui.click(758,497)
rand_sleep()
# 编辑
pyautogui.click(1652,671)
time.sleep(3)
# 模拟滚动到底部
pyautogui.click(1652,671)
for _ in range(2):
pyautogui.scroll(-1000)
rand_sleep()
# time.sleep(0.3) # 每滚轮一下间隔0.3秒
# 户籍地址点击三次
for i in range(3):
pyautogui.click(1404,473)
rand_sleep()
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(address)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 下移到底部
for _ in range(1):
pyautogui.scroll(-1000)
rand_sleep()
# 确认,回到最初的界面
pyautogui.click(1027,857)
time.sleep(5) # 保存时间长一点
# 自动最大化VSCode
win.maximize()
print("VSCode已自动最大化,程序结束")

25个孩子大约12分钟

小4班的表单来了,这份不是我设计的模版,班主任收集了一些幼儿的基础信息




家长自己填写的省市,就很不完整,缺少区,还是要用接龙管家里面的"省市区"

不过地址有的

这个文件上有个图标,看看Python能不能识别,结果是可以显示图片








地址修改了,还有一个外省的"市""区"

接龙表单里我们收集了家长填写的省市区,

如何拆分成开来,并且能






python
'''
园园通小班孩子分班后补全信息
1.外省户口孩子更新地址(只更新地址,把待更新改掉)
3.Python模拟鼠标点击园园通按钮,进行分班
4.前期已经3101搜索过了。
'''
import openpyxl
import pyautogui
import time
import pyperclip
import pygetwindow as gw
# 1. 找到VSCode窗口(匹配标题含 Visual Studio Code)
vscode_wins = gw.getWindowsWithTitle("Visual Studio Code")
if not vscode_wins:
print("未找到VSCode窗口,请先打开VSCode再运行!")
else:
win = vscode_wins[0]
# 自动最小化VSCode
win.minimize()
print("VSCode已自动最小化,你有5秒时间移动鼠标到目标位置")
time.sleep(5) # 等待5秒给你放鼠标
import random
# 随机休眠:1~3秒,带小数,模拟真人操作
def rand_sleep():
t = random.uniform(2, 3)
time.sleep(t)
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260805班级信息表.xlsx"
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260806小1班圆圆通信息补全(1).xlsx"
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260806小3班圆圆通信息补全.xlsx"
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\小4学生信息收集表_群收集.xlsx"
file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\小5班圆圆通信息填写收集(1).xlsx"
wb = openpyxl.load_workbook(file_path)
# 读取表格
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
for row in ws.iter_rows(min_row=2, values_only=True): # 从第二行开始读取姓名
# for row in ws.iter_rows(min_row=21, values_only=True): # 如果出问题,断了,从第X行读取孩子姓名
if len(row) < 4:
continue
name = row[0]
# name = row[4] # 小四班姓名在第五列
if not name or str(name).strip() == "":
continue
# address = row[4]
# address = row[10] # 小四班户籍详细地址在第11列
address = row[11] # 小五班户籍详细地址在第12列
# class_name = row[1]
# garden_name = row[1]
# data_list.append([class_name, name])
print(name)
print(address)
# 点击姓名栏,
pyautogui.click(861,376)
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(name)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 搜索
pyautogui.click(758,497)
rand_sleep()
# 编辑
pyautogui.click(1652,671)
time.sleep(3)
# 模拟滚动到底部
pyautogui.click(1652,671)
for _ in range(2):
pyautogui.scroll(-1000)
rand_sleep()
# time.sleep(0.3) # 每滚轮一下间隔0.3秒
# 户籍地址点击三次
for i in range(3):
pyautogui.click(1404,473)
rand_sleep()
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(address)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 下移到底部
for _ in range(1):
pyautogui.scroll(-1000)
rand_sleep()
# 确认,回到最初的界面
pyautogui.click(1027,857)
time.sleep(5) # 保存时间长一点
# 自动最大化VSCode
win.maximize()
print("VSCode已自动最大化,程序结束")
最后一个小2班
python
'''
园园通小班孩子分班后补全信息
1.外省户口孩子更新地址(只更新地址,把待更新改掉)
3.Python模拟鼠标点击园园通按钮,进行分班
4.前期已经3101搜索过了。
'''
import openpyxl
import pyautogui
import time
import pyperclip
import pygetwindow as gw
# 1. 找到VSCode窗口(匹配标题含 Visual Studio Code)
vscode_wins = gw.getWindowsWithTitle("Visual Studio Code")
if not vscode_wins:
print("未找到VSCode窗口,请先打开VSCode再运行!")
else:
win = vscode_wins[0]
# 自动最小化VSCode
win.minimize()
print("VSCode已自动最小化,你有5秒时间移动鼠标到目标位置")
time.sleep(5) # 等待5秒给你放鼠标
import random
# 随机休眠:1~3秒,带小数,模拟真人操作
def rand_sleep():
t = random.uniform(2, 3)
time.sleep(t)
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260805班级信息表.xlsx"
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260806小1班圆圆通信息补全(1).xlsx"
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260806小3班圆圆通信息补全.xlsx"
# file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\小4学生信息收集表_群收集.xlsx"
file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260806小2班圆圆通信息补全模版.xlsx"
wb = openpyxl.load_workbook(file_path)
# 读取表格
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
for row in ws.iter_rows(min_row=11, values_only=True): # 从第二行开始读取姓名
# for row in ws.iter_rows(min_row=21, values_only=True): # 如果出问题,断了,从第X行读取孩子姓名
if len(row) < 4:
continue
name = row[0][2:]
# name = row[4] # 小四班姓名在第五列
if not name or str(name).strip() == "":
continue
address = row[4]
# address = row[10] # 小四班户籍详细地址在第11列
# address = row[11] # 小五班户籍详细地址在第12列
# class_name = row[1]
# garden_name = row[1]
# data_list.append([class_name, name])
print(name)
print(address)
# 点击姓名栏,
pyautogui.click(861,376)
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(name)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 搜索
pyautogui.click(758,497)
rand_sleep()
# 编辑
pyautogui.click(1652,671)
time.sleep(3)
# 模拟滚动到底部
pyautogui.click(1652,671)
for _ in range(2):
pyautogui.scroll(-1000)
rand_sleep()
# time.sleep(0.3) # 每滚轮一下间隔0.3秒
# 户籍地址点击三次
for i in range(3):
pyautogui.click(1404,473)
rand_sleep()
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(address)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 下移到底部
for _ in range(1):
pyautogui.scroll(-1000)
rand_sleep()
# 确认,回到最初的界面
pyautogui.click(1027,857)
time.sleep(5) # 保存时间长一点
# 自动最大化VSCode
win.maximize()
print("VSCode已自动最大化,程序结束")

同样取0列和4列,但是0列的姓名前面有两位数字学号,切片从索引2开始提取纯姓名。
三、修改后验证
现在5个小班的带填写户籍地址都修改了

我把园园通数据都导出来,看看有没有没有填写的。

r


后继问题:
1、补全户籍地址、居住地址中的省市区(大部分地址有只有路弄号)
2、修改小班外省户籍地址的(省、市、区)的正确地址(之前默认选第一个)
3、补全少数民族(实在很少,所以就把5个EXCEL打开,看看那几个是少数民族,手动复制名字单独修改保存)






