脚本自动化 #

Apps Script 简介 #

什么是 Apps Script #

text
Apps Script 定义:

Google Apps Script 是一种基于云的脚本平台,
用于在 Google Workspace 平台上开发轻量级应用程序。

核心特点:
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  基于 JavaScript:                                           │
│  ├── 熟悉的语法                                              │
│  ├── 易于学习                                                │
│  └── 丰富的 API                                              │
│                                                             │
│  云端运行:                                                  │
│  ├── 无需服务器                                              │
│  ├── 自动扩展                                                │
│  └── 随处访问                                                │
│                                                             │
│  深度集成:                                                  │
│  ├── 与 Google 服务无缝集成                                  │
│  ├── Docs、Sheets、Drive 等                                 │
│  └── 外部 API 调用                                           │
│                                                             │
│  自动化能力:                                                │
│  ├── 自动执行任务                                            │
│  ├── 定时触发                                                │
│  └── 事件驱动                                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

应用场景 #

text
自动化场景:

┌─────────────────────────────────────────────────────────────┐
│                    自动化应用场景                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  文档处理:                                                  │
│  ├── 批量创建文档                                            │
│  ├── 自动格式化                                              │
│  ├── 内容替换                                                │
│  └── 模板填充                                                │
│                                                             │
│  数据处理:                                                  │
│  ├── 从 Sheets 导入数据                                      │
│  ├── 生成报告                                                │
│  ├── 数据同步                                                │
│  └── 自动汇总                                                │
│                                                             │
│  工作流自动化:                                              │
│  ├── 审批流程                                                │
│  ├── 通知发送                                                │
│  ├── 定时任务                                                │
│  └── 条件触发                                                │
│                                                             │
│  集成扩展:                                                  │
│  ├── 连接外部服务                                            │
│  ├── API 调用                                               │
│  ├── 数据导入导出                                            │
│  └── 自定义功能                                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

脚本编辑器 #

打开编辑器 #

text
访问脚本编辑器:

方式一:从文档
┌─────────────────────────────────────┐
│  扩展程序 → Apps Script             │
│  打开脚本编辑器                     │
└─────────────────────────────────────┘

方式二:直接访问
├── script.google.com
└── 创建新项目

编辑器界面:
┌─────────────────────────────────────────────────────────────┐
│  文件  编辑  视图  运行  部署  帮助                          │
├─────────────────────────────────────────────────────────────┤
│  📁 文件                      │  代码编辑区                 │
│  ├── 📄 Code.gs              │                             │
│  └── 📄 其他文件              │  function myFunction() {    │
│                              │    // 代码                   │
│  🔧 服务                     │  }                          │
│  ├── Google Docs             │                             │
│  ├── Google Sheets           │                             │
│  └── 更多...                 │                             │
├─────────────────────────────────────────────────────────────┤
│  ▶ 运行  💾 保存  📤 部署                                   │
└─────────────────────────────────────────────────────────────┘

编辑器功能 #

text
编辑器功能:

文件管理:
├── 创建新文件
├── 重命名文件
├── 删除文件
└── 文件组织

代码编辑:
├── 语法高亮
├── 代码补全
├── 错误提示
└── 格式化

调试工具:
├── 运行函数
├── 调试模式
├── 日志查看
└── 执行记录

部署选项:
├── 作为 API 部署
├── 作为网页应用
├── 作为插件
└── 作为库

基础语法 #

变量和数据类型 #

text
JavaScript 基础:

变量声明:
```javascript
// 使用 var、let 或 const
var name = "Google Docs";
let count = 10;
const PI = 3.14159;

// 数据类型
let text = "Hello";        // 字符串
let number = 42;           // 数字
let isTrue = true;         // 布尔值
let items = [1, 2, 3];     // 数组
let obj = { name: "Doc" }; // 对象

函数定义 #

text
函数语法:

```javascript
// 函数声明
function sayHello() {
  Logger.log("Hello, World!");
}

// 带参数的函数
function greet(name) {
  Logger.log("Hello, " + name);
}

// 带返回值的函数
function add(a, b) {
  return a + b;
}

// 箭头函数
const multiply = (a, b) => a * b;

条件和循环 #

text
控制流:

```javascript
// 条件语句
if (score >= 90) {
  grade = "A";
} else if (score >= 80) {
  grade = "B";
} else {
  grade = "C";
}

// for 循环
for (let i = 0; i < 5; i++) {
  Logger.log(i);
}

// for...of 循环
let items = ["a", "b", "c"];
for (let item of items) {
  Logger.log(item);
}

// while 循环
let count = 0;
while (count < 5) {
  Logger.log(count);
  count++;
}

文档操作 #

获取文档 #

text
文档操作 API:

获取当前文档:
```javascript
function getDocument() {
  // 获取当前活动文档
  var doc = DocumentApp.getActiveDocument();
  
  // 获取文档名称
  var name = doc.getName();
  Logger.log("文档名称: " + name);
  
  // 获取文档 ID
  var id = doc.getId();
  Logger.log("文档 ID: " + id);
  
  return doc;
}

// 通过 ID 打开文档
function openById() {
  var doc = DocumentApp.openById("文档ID");
  return doc;
}

操作内容 #

text
内容操作:

获取文档内容:
```javascript
function getBody() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  
  // 获取文本内容
  var text = body.getText();
  Logger.log(text);
  
  return body;
}

// 添加内容
function addContent() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  
  // 添加段落
  body.appendParagraph("这是一个新段落。");
  
  // 添加标题
  body.appendParagraph("标题").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  
  // 添加列表
  body.appendListItem("列表项 1");
  body.appendListItem("列表项 2");
  
  // 保存更改
  doc.saveAndClose();
}

查找和替换 #

text
查找替换操作:

```javascript
function findAndReplace() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  
  // 查找文本
  var found = body.findText("旧文本");
  while (found) {
    var element = found.getElement();
    var text = element.asText();
    var start = found.getStartOffset();
    var end = found.getEndOffsetInclusive();
    
    // 替换文本
    text.deleteText(start, end);
    text.insertText(start, "新文本");
    
    found = body.findText("旧文本", found);
  }
  
  doc.saveAndClose();
}

// 简单替换
function simpleReplace() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  
  body.replaceText("旧文本", "新文本");
  
  doc.saveAndClose();
}

自定义菜单 #

创建菜单 #

text
添加自定义菜单:

```javascript
function onOpen() {
  var ui = DocumentApp.getUi();
  
  ui.createMenu('自定义工具')
    .addItem('插入日期', 'insertDate')
    .addItem('格式化文档', 'formatDocument')
    .addSeparator()
    .addSubMenu(ui.createMenu('更多选项')
      .addItem('选项 A', 'optionA')
      .addItem('选项 B', 'optionB'))
    .addToUi();
}

// 菜单功能函数
function insertDate() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var date = Utilities.formatDate(
    new Date(), 
    Session.getScriptTimeZone(), 
    'yyyy-MM-dd'
  );
  body.appendParagraph(date);
}

function formatDocument() {
  // 格式化逻辑
}

function optionA() {
  // 选项 A 逻辑
}

function optionB() {
  // 选项 B 逻辑
}

对话框交互 #

text
创建对话框:

```javascript
function showDialog() {
  var html = HtmlService.createHtmlOutput(`
    <style>
      body { font-family: Arial; padding: 20px; }
      input { width: 100%; padding: 8px; margin: 10px 0; }
      button { padding: 10px 20px; }
    </style>
    <h2>输入信息</h2>
    <input type="text" id="name" placeholder="输入名称">
    <button onclick="submit()">确定</button>
    <script>
      function submit() {
        var name = document.getElementById('name').value;
        google.script.run.processForm(name);
        google.script.host.close();
      }
    </script>
  `);
  
  DocumentApp.getUi()
    .showModalDialog(html, '自定义对话框');
}

// 处理表单数据
function processForm(name) {
  var doc = DocumentApp.getActiveDocument();
  doc.getBody().appendParagraph("名称: " + name);
}

触发器 #

触发器类型 #

text
触发器分类:

┌─────────────────────────────────────────────────────────────┐
│                    触发器类型                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  简单触发器:                                                │
│  ├── onOpen:打开文档时触发                                 │
│  ├── onEdit:编辑时触发                                     │
│  ├── onInstall:安装时触发                                  │
│  └── 无需设置,自动运行                                      │
│                                                             │
│  可安装触发器:                                              │
│  ├── 时间驱动:定时执行                                      │
│  ├── 文档驱动:文档事件触发                                  │
│  ├── 表单驱动:表单提交触发                                  │
│  └── 需要手动设置                                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

时间触发器 #

text
设置定时任务:

```javascript
// 创建时间触发器
function createTimeTrigger() {
  ScriptApp.newTrigger('dailyTask')
    .timeBased()
    .atHour(9)  // 每天 9 点
    .everyDays(1)  // 每天执行
    .create();
}

// 定时执行的任务
function dailyTask() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  
  // 添加日期标记
  var date = Utilities.formatDate(
    new Date(), 
    Session.getScriptTimeZone(), 
    'yyyy-MM-dd HH:mm'
  );
  
  body.appendParagraph("自动更新: " + date);
}

// 删除触发器
function deleteTriggers() {
  var triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(function(trigger) {
    if (trigger.getHandlerFunction() === 'dailyTask') {
      ScriptApp.deleteTrigger(trigger);
    }
  });
}

实用示例 #

批量创建文档 #

text
批量创建文档:

```javascript
function createMultipleDocs() {
  var titles = [
    "报告 1",
    "报告 2",
    "报告 3"
  ];
  
  var folder = DriveApp.getFolderById("文件夹ID");
  
  titles.forEach(function(title) {
    // 创建新文档
    var doc = DocumentApp.create(title);
    
    // 添加内容
    var body = doc.getBody();
    body.appendParagraph("标题: " + title);
    body.appendParagraph("创建时间: " + new Date());
    
    // 移动到指定文件夹
    var file = DriveApp.getFileById(doc.getId());
    folder.addFile(file);
    DriveApp.getRootFolder().removeFile(file);
  });
}

自动生成报告 #

text
生成报告示例:

```javascript
function generateReport() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  
  // 清空现有内容
  body.clear();
  
  // 添加标题
  var title = body.appendParagraph("月度报告");
  title.setHeading(DocumentApp.ParagraphHeading.TITLE);
  title.setAlignment(DocumentApp.HorizontalAlignment.CENTER);
  
  // 添加日期
  var date = Utilities.formatDate(
    new Date(), 
    Session.getScriptTimeZone(), 
    'yyyy年MM月dd日'
  );
  body.appendParagraph("日期: " + date);
  
  // 添加表格
  var table = body.appendTable();
  var headerRow = table.appendTableRow();
  headerRow.appendTableCell("项目");
  headerRow.appendTableCell("数值");
  
  var dataRow = table.appendTableRow();
  dataRow.appendTableCell("访问量");
  dataRow.appendTableCell("1000");
  
  // 保存
  doc.saveAndClose();
}

调试技巧 #

日志输出 #

text
使用日志:

```javascript
function debugExample() {
  // 使用 Logger
  Logger.log("开始执行");
  Logger.log("变量值: %s", someVariable);
  
  // 使用 console(推荐)
  console.log("调试信息");
  console.info("信息级别");
  console.warn("警告级别");
  console.error("错误级别");
}

// 查看日志
// 运行后:查看 → 执行记录

错误处理 #

text
错误处理:

```javascript
function errorHandling() {
  try {
    var doc = DocumentApp.getActiveDocument();
    var body = doc.getBody();
    
    // 可能出错的代码
    var text = body.getText();
    
    if (text === "") {
      throw new Error("文档为空");
    }
    
    Logger.log("执行成功");
    
  } catch (error) {
    Logger.log("错误: " + error.message);
    DocumentApp.getUi().alert("发生错误: " + error.message);
  } finally {
    Logger.log("执行完成");
  }
}

下一步 #

现在你已经掌握了脚本自动化基础,接下来学习 版本控制,管理文档的修改历史!

最后更新:2026-04-11