脚本自动化 #
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