关于 spreadsheet-automation
面向 Google Sheets 使用者的自动化实践指南,涵盖公式、Apps Script、多工作表设计及外部工具连接,帮助将重复的数据处理和工作流转为表格自动化。
主要功能
- 01高级公式与数据整理
- 02多工作表系统设计
- 03Apps Script 定时与事件自动化
- 04连接 Zapier、Make 和 n8n
- 05仪表盘与报表自动更新
适用场景
- 01汇总多个表格的数据
- 02按条件发送邮件或通知
- 03构建轻量 CRM 与线索看板
- 04定时抓取 API 数据并写入表格
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jk-0001/ skills --skill spreadsheet-automation安装后在 Claude Code 中输入/spreadsheet-automation确认已加载。
详细介绍
电子表格自动化
概述
Google Sheets 不只是用来做预算和列表的工具。借助合适的公式、Apps Script 和集成,它还能变成数据库、CRM、项目跟踪器、分析仪表板和工作流引擎——全都集成在一个免费工具中。本指南将介绍如何在 Sheets 中构建生产级系统,以替代每月费用为 50-500 美元的 SaaS 工具。
第 1 步:确定要在 Sheets 中自动化的内容
并非所有工作流都适合在 Sheets 中处理。以下是适合使用 Sheets 的情况。
适合使用 Sheets 自动化的场景:
- 从多个来源收集数据(表单回复、API 数据、手动输入)→ 集中到一处
- 轻量级数据库(客户列表、库存、项目跟踪器)→ 低于 10K 行,关系简单
- 仪表板和报告(从其他工具提取数据、可视化、共享)
- 工作流触发器(新增或更新行时 → 发送邮件、创建任务、更新另一张工作表)
- 数据转换(清理、格式化、丰富来自杂乱来源的数据)
不适合的场景(改用真正的数据库或工具):
- 大量计算(数百万行、复杂查询)→ 使用 BigQuery、Airtable 或 SQL 数据库
- 10 位以上用户同时实时协作 → 使用 Airtable、Notion 或专用项目管理工具
- 无法承受意外删除的关键数据 → 使用配有备份和版本控制的真正数据库
- 复杂的关系型数据(多对多关系)→ 使用 Airtable 或正规的数据库
检查当前的手动工作(10 分钟):
- 列出你在 Sheets 中手动执行的任务(复制/粘贴、数据录入、格式设置、更新其他工作表)
- 哪些任务是重复性的?(每天、每周或由事件触发)
- 哪些任务每次需要 5 分钟以上?
- 哪些任务有明确的逻辑?(“如果这样,那么就那样”)
容易自动化的任务清单:
- 根据其他单元格自动填充单元格(公式)
- 从外部来源提取数据(API、其他工作表、网页抓取)
- 自动设置格式或清理数据(删除重复项、统一日期格式、提取值)
- 满足条件时发送通知(邮件提醒、Slack 消息)
- 创建自动更新的图表或仪表板
- 在 Sheets 和其他工具之间同步数据(CRM、项目管理、会计)
第 2 步:掌握高级公式(无需编写代码)
大多数 Sheets 自动化都从这里开始。掌握这些公式,无需使用 Apps Script,就能构建 80% 的所需功能。
核心公式参考
QUERY(Sheets 中类似 SQL 的查询):
=QUERY(A1:D100, "SELECT A, B, C WHERE D > 1000 ORDER BY C DESC")
- 用途:筛选、排序、分组和汇总数据
- 语法:
SELECT [columns] WHERE [condition] ORDER BY [column] LIMIT [number] - 示例:提取所有订单金额超过 $1,000 的客户,并按日期排序
IMPORTRANGE(从其他工作表提取数据):
=IMPORTRANGE("spreadsheet_url", "Sheet1!A1:D100")
- 用途:将多个工作表中的数据集中到一个主工作表中
- 设置:首次使用时,需要批准访问权限(出现提示时点击“允许访问”)
- 示例:将各地区团队工作表中的销售数据提取到一个主仪表板中
ARRAYFORMULA(将公式应用于整列):
=ARRAYFORMULA(IF(A2:A="",,B2:B*C2:C))
- 用途:自动计算所有行(无需向下拖动公式)
- 示例:为新增的每一行自动计算数量 × 价格
VLOOKUP / XLOOKUP(从另一张表查找值):
=VLOOKUP(A2, Sheet2!A:B, 2, FALSE)
- 用途:匹配并提取相关数据(例如,根据客户姓名提取其电子邮件地址)
- XLOOKUP(较新):更灵活,可从左向右或从右向左搜索
FILTER(动态筛选):
=FILTER(A2:D100, D2:D100>1000, C2:C100="Active")
- 用途:仅显示符合条件的行(数据变化时自动更新)
- 示例:仅显示收入超过 $1,000 的活跃客户
UNIQUE(删除重复项):
=UNIQUE(A2:A100)
- 用途:从列表中提取唯一值(源数据变化时自动更新)
REGEXEXTRACT(从文本中提取模式):
=REGEXEXTRACT(A2, "[0-9]{3}-[0-9]{3}-[0-9]{4}")
- 用途:从杂乱文本中提取电话号码、电子邮件地址、URL 或任意模式
- 示例:从电子邮件地址中提取域名
IMPORTXML / IMPORTHTML(抓取网页数据):
=IMPORTXML("https://example.com", "//h1")
- 用途:从网站提取实时数据(价格、头条新闻、表格)
- 示例:自动跟踪竞争对手的定价
步骤 3:构建多工作表系统
单工作表解决方案能力有限。真正的强大之处在于将多个工作表连接成一个系统。
系统架构模式:
SHEET 1: Data Entry (input form or manual entry)
↓
SHEET 2: Master Database (cleaned, validated, enriched)
↓
SHEET 3: Dashboard (charts, summaries, insights)
↓
SHEET 4: Exports/Reports (formatted for sharing)
示例:使用 Sheets 搭建简单的 CRM
工作表 1:潜在客户录入表单
- 列:姓名、电子邮件、公司、来源、添加日期
- 用途:Google 表单 → 自动填入此工作表
- 验证:检查电子邮件格式、必填字段
工作表 2:潜在客户主数据库
- 使用
IMPORTRANGE或直接引用从工作表 1 提取数据 - 添加补充信息:状态(新建/已联系/已确认/已关闭)、最近联系日期、备注
- 公式示例:
=IF(ISBLANK(D2), "New", D2)(如果状态为空,则自动设为“New”)
工作表 3:仪表板
- 潜在客户总数:
=COUNTA(MasterDB!A2:A) - 本周潜在客户数:
=COUNTIF(MasterDB!E2:E, ">="&TODAY()-7) - 转化率:
=COUNTIF(MasterDB!D2:D, "Closed")/COUNTA(MasterDB!A2:A) - 图表:按来源统计潜在客户(饼图)
工作表 4:每周报告
- 公式:
=FILTER(MasterDB!A2:E, MasterDB!E2:E>=TODAY()-7) - 自动提取本周潜在客户,供评审会议使用
核心原则:
- 一个工作表对应一个用途(不要混合输入、存储和展示)
- 使用公式连接工作表(避免手动复制粘贴)
- 保护重要工作表(防止意外修改)
步骤 4:学习 Apps Script 基础(Google 为 Sheets 提供的 JavaScript)
Apps Script 可以完成公式无法实现的操作:发送电子邮件、调用 API、创建自定义菜单、按计划运行代码。
何时使用 Apps Script:
- 公式无法实现所需功能(发送电子邮件、调用 API、处理复杂逻辑)
- 需要按计划运行自动化任务(每小时、每天、每周)
- 想要创建自定义函数或菜单项
如何访问 Apps Script:
- 打开你的 Google Sheet
- 扩展程序 → Apps Script
- 在编辑器中编写代码
示例 1:添加新行时发送电子邮件提醒
function onEdit(e) {
var sheet = e.source.getActiveSheet();
// Only run on "Lead Entry" sheet
if (sheet.getName() !== "Lead Entry Form") return;
// Get edited row and column
var row = e.range.getRow();
var col = e.range.getColumn();
// If new row added (row > 1 to skip header)
if (row > 1 && col === 1) {
var name = sheet.getRange(row, 1).getValue();
var email = sheet.getRange(row, 2).getValue();
// Send email notification
MailApp.sendEmail({
to: "[email protected]",
subject: "New Lead: " + name,
body: "Name: " + name + "\nEmail: " + email
});
}
}
设置方法:
- 将代码粘贴到 Apps Script 编辑器中
- 保存(Ctrl/Cmd + S)
- 设置触发器:Triggers(时钟图标)→ Add Trigger →
onEdit→ From spreadsheet → On edit → Save - 出现提示时授权权限
示例 2:从 API 获取数据并写入工作表
function fetchAPIData() {
var url = "https://api.example.com/data";
var options = {
"method": "GET",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
};
var response = UrlFetchApp.fetch(url, options);
var data = JSON.parse(response.getContentText());
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("API Data");
// Clear existing data
sheet.clear();
// Write headers
sheet.appendRow(["ID", "Name", "Value"]);
// Write data rows
data.forEach(function(item) {
sheet.appendRow([item.id, item.name, item.value]);
});
}
设置方法:
- 粘贴代码,并替换
url和YOUR_API_KEY - 手动运行一次进行测试(点击 Run 按钮)
- 设置基于时间的触发器:Triggers → Add Trigger →
fetchAPIData→ Time-driven → Hour timer → Every hour
示例 3:自动归档旧行
function archiveOldRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("Active Tasks");
var archiveSheet = ss.getSheetByName("Archive");
var data = sourceSheet.getDataRange().getValues();
var today = new Date();
var cutoffDate = new Date(today.getTime() - (30 * 24 * 60 * 60 * 1000)); // 30 days ago
// Start from row 2 (skip header)
for (var i = data.length - 1; i >= 1; i--) {
var rowDate = new Date(data[i][3]); // Column D = date
if (rowDate < cutoffDate) {
// Copy row to archive
archiveSheet.appendRow(data[i]);
// Delete from source
sourceSheet.deleteRow(i + 1);
}
}
}
常见的 Apps Script 模式:
- 获取数据:
sheet.getRange("A1:D10").getValues() - 写入数据:
sheet.getRange("A1").setValue("Hello") - 追加行:
sheet.appendRow([val1, val2, val3]) - 发送电子邮件:
MailApp.sendEmail(to, subject, body) - 发起 HTTP 请求:
UrlFetchApp.fetch(url, options) - 获取当前日期:
new Date()
Apps Script 资源:
- 官方文档:https://developers.google.com/apps-script
- ChatGPT 或 Claude:“编写 Apps Script 来[执行 X]” → 复制/粘贴/测试
第 5 步:将 Sheets 连接到其他工具(Zapier、Make、n8n)
将 Sheets 与其他工具集成后,功能可提升 10 倍。
集成策略:
策略 1:将 Sheets 用作数据库(只写)
适用场景:从表单、Webhook 或其他工具收集数据 → 写入 Sheets 进行存储
工作流示例(Zapier/Make):
TRIGGER: New Typeform submission
ACTION 1: Add row to Google Sheets
ACTION 2: Send email confirmation (optional)
工作流示例(Webhook → Sheets):
TRIGGER: Webhook received (from website, Stripe, etc.)
ACTION: Parse JSON → Write to Google Sheets
策略 2:将 Sheets 用作触发器(只读)
适用场景:在 Sheets 中添加/更新行时 → 在其他位置触发操作
工作流示例:
TRIGGER: New row in Google Sheets (check every 15 min)
CONDITION: Status column = "Approved"
ACTION: Create task in Asana / Send email / Post to Slack
策略 3:将 Sheets 用作中间人(读写)
适用场景:Sheets 从工具 A 获取数据,进行处理,再推送到工具 B
工作流示例(将 CRM 同步到电子邮件工具):
TRIGGER: New row in Google Sheets (CRM export)
CONDITION: Email column not empty + Tag column = "Newsletter"
ACTION: Add contact to ConvertKit / Mailchimp
适合与 Sheets 集成的工具:
- Zapier: 最简单、应用支持范围最广,每月 $20-50
- Make(Integromat): 功能更强大、可视化,每月 $9-30
- n8n: 可自托管、无限制、免费(或托管版每月 $20)
常见集成:
- Google Forms → Sheets(原生支持,无需工具)
- Sheets → Gmail(根据 Sheet 数据发送电子邮件)
- Sheets → Slack(Sheet 发生变化时向 Slack 发布更新)
- Sheets ↔ Airtable(双向同步数据)
- API → Sheets(将任何 API 的数据拉取到 Sheets)
第 6 步:真实场景中的自动化示例
示例 1:自动化发票跟踪器
问题: 手动跟踪已发送、已付款和逾期的发票
解决方案:
工作表 1:发票日志
- 列:发票编号、客户、金额、发送日期、到期日期、状态、逾期天数
公式技巧:
Status = =IF(G2="Paid", "Paid", IF(E2<TODAY(), "Overdue", "Pending"))
Days Overdue = =IF(E2<TODAY(), TODAY()-E2, 0)
Apps Script(每天运行):
function sendOverdueReminders() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Invoice Log");
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
var status = data[i][6]; // Status column
var client = data[i][1];
var invoiceNum = data[i][0];
var amount = data[i][2];
if (status === "Overdue") {
MailApp.sendEmail({
to: "[email protected]",
subject: "Reminder: Invoice " + invoiceNum + " Overdue",
body: "Hi " + client + ",\n\nInvoice " + invoiceNum + " for $" + amount + " is overdue. Please remit payment.\n\nThank you!"
});
}
}
}
触发器: 时间驱动,每天上午 9 点
示例 2:潜在客户评分系统
问题: 根据匹配度手动筛选潜在客户
解决方案:
工作表 1:潜在客户数据
- 列:姓名、公司规模、行业、预算、紧迫程度、评分、优先级
公式评分:
Score = =
IF(B2="Enterprise", 30, IF(B2="Mid-Market", 20, 10)) +
IF(C2="SaaS", 20, IF(C2="E-commerce", 15, 5)) +
IF(D2>10000, 30, IF(D2>5000, 20, 10)) +
IF(E2="Immediate", 20, IF(E2="This Quarter", 10, 0))
Priority = =IF(F2>=70, "Hot", IF(F2>=50, "Warm", "Cold"))
自动化(Zapier):
TRIGGER: New row in Google Sheets
CONDITION: Priority = "Hot"
ACTION 1: Add to Pipedrive as high-priority deal
ACTION 2: Send Slack notification to sales team
示例 3:内容日历 + 自动发布
问题: 手动跟踪和安排社交媒体帖子
解决方案:
工作表 1:内容日历
- 列:日期、平台、帖子文本、图片 URL、状态
Apps Script(每小时运行):
function publishScheduledPosts() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Content Calendar");
var data = sheet.getDataRange().getValues();
var now = new Date();
for (var i = 1; i < data.length; i++) {
var scheduleDate = new Date(data[i][0]);
var status = data[i][4];
// If scheduled for now or past, and not yet published
if (scheduleDate <= now && status === "Scheduled") {
var platform = data[i][1];
var text = data[i][2];
// Call API to post (Twitter, LinkedIn, etc.)
postToAPI(platform, text);
// Mark as published
sheet.getRange(i+1, 5).setValue("Published");
}
}
}
function postToAPI(platform, text) {
// Example: Twitter API call
var url = "https://api.twitter.com/2/tweets";
var payload = JSON.stringify({"text": text});
var options = {
"method": "POST",
"headers": {
"Authorization": "Bearer YOUR_TWITTER_TOKEN",
"Content-Type": "application/json"
},
"payload": payload
};
UrlFetchApp.fetch(url, options);
}
第 7 步:性能与可扩展性
当 Sheets 开始变慢时:
问题: 工作表有 10K+ 行,公式复杂 → 加载/编辑速度慢
解决方案:
- 使用 QUERY 替代 FILTER + SORT: 效率更高
- 限制 ARRAYFORMULA 范围: 使用
A2:A1000,而不是A:A(整列) - 尽可能使用静态值而非公式: 复制 → 粘贴值
- 拆分为多个工作表: 将旧数据归档到单独的工作表
- 谨慎使用 Importrange: 每次调用都会增加加载时间
- 使用 Apps Script 缓存数据: 拉取一次外部数据并存储,定期刷新,而非使用实时公式
何时应从 Sheets 迁移:
- 50K+ 行 → 使用 Airtable 或 BigQuery
- 20+ 用户实时协作 → 使用 Airtable 或 Notion
- 复杂的关系查询 → 使用 Airtable 或 SQL 数据库
- 关键任务数据 → 使用具备备份的正规数据库
备份策略:
- 版本历史记录: 文件 → 版本历史记录(Google 会自动保存,你可以还原)
- 自动导出: 使用 Apps Script 每周导出到 Google Drive
- 下载副本: 文件 → 下载 → Excel 或 CSV(手动备份)
第 8 步:电子表格自动化投资回报率
投资回报率计算:
Time Saved per Month (hours) = (Minutes per task / 60) × Frequency per month
Monthly Value = Time Saved × Hourly Rate
Setup Cost = (Setup time in hours × Hourly Rate) + Tool costs
Payback Period (months) = Setup Cost / Monthly Value
If payback period < 3 months → Definitely worth it
If payback period > 6 months → Probably not worth it
示例:
Task: Manually entering form submissions into CRM (15 min, 40x/month = 10 hours/month saved)
Your hourly rate: $50/hour
Monthly value saved: $500
Setup time: 2 hours
Setup cost: $100 (time) + $0 (Google Forms + Sheets are free)
Payback: $100 / $500 = 0.2 months → Absolutely worth it
规则: 如果每月能节省 5 小时以上,就将其自动化。
应避免的电子表格自动化错误
- 把所有内容都放在一个超大的工作表中。 拆分为多个工作表(输入、数据库、仪表板、导出)。
- 不保护重要工作表。 一次误删就可能抹掉整个系统。使用 Data → Protect sheets and ranges。
- 过度使用易变公式。
NOW()、TODAY()、RAND()会不断重新计算,拖慢工作表。请谨慎使用。 - 不记录公式说明。 添加注释(右键单元格 → Insert comment)来解释复杂公式。
- 忘记为 Apps Script 设置触发器。 除非设置触发器(onEdit、定时触发等),否则代码不会运行。
- 上线前不测试自动化。 先用虚拟数据进行测试。出错的自动化如果发送了 100 封邮件,后果不堪设想。
- 将 Sheets 用于不适合的场景。 如果数据达到 20K 行以上,请迁移到真正的数据库。