mcpField
S
spreadsheet-automation

spreadsheet-automation

github.com/jk-0001数据与数据库37 次安装
代码仓库

关于 spreadsheet-automation

面向 Google Sheets 使用者的自动化实践指南,涵盖公式、Apps Script、多工作表设计及外部工具连接,帮助将重复的数据处理和工作流转为表格自动化。

主要功能

  1. 01高级公式与数据整理
  2. 02多工作表系统设计
  3. 03Apps Script 定时与事件自动化
  4. 04连接 Zapier、Make 和 n8n
  5. 05仪表盘与报表自动更新

适用场景

  1. 01汇总多个表格的数据
  2. 02按条件发送邮件或通知
  3. 03构建轻量 CRM 与线索看板
  4. 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 分钟):

  1. 列出你在 Sheets 中手动执行的任务(复制/粘贴、数据录入、格式设置、更新其他工作表)
  2. 哪些任务是重复性的?(每天、每周或由事件触发)
  3. 哪些任务每次需要 5 分钟以上?
  4. 哪些任务有明确的逻辑?(“如果这样,那么就那样”)

容易自动化的任务清单:

  • 根据其他单元格自动填充单元格(公式)
  • 从外部来源提取数据(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:

  1. 打开你的 Google Sheet
  2. 扩展程序 → Apps Script
  3. 在编辑器中编写代码
示例 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
    });
  }
}

设置方法:

  1. 将代码粘贴到 Apps Script 编辑器中
  2. 保存(Ctrl/Cmd + S)
  3. 设置触发器:Triggers(时钟图标)→ Add Trigger → onEdit → From spreadsheet → On edit → Save
  4. 出现提示时授权权限
示例 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]);
  });
}

设置方法:

  1. 粘贴代码,并替换 url 和 YOUR_API_KEY
  2. 手动运行一次进行测试(点击 Run 按钮)
  3. 设置基于时间的触发器: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 资源:


第 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+ 行,公式复杂 → 加载/编辑速度慢

解决方案:

  1. 使用 QUERY 替代 FILTER + SORT: 效率更高
  2. 限制 ARRAYFORMULA 范围: 使用 A2:A1000,而不是 A:A(整列)
  3. 尽可能使用静态值而非公式: 复制 → 粘贴值
  4. 拆分为多个工作表: 将旧数据归档到单独的工作表
  5. 谨慎使用 Importrange: 每次调用都会增加加载时间
  6. 使用 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 行以上,请迁移到真正的数据库。

评论

支持 Markdown