如何从 Google Sheets 自动打印标签
你的标签数据已经存在于 Google Sheets 中。行在那里,列保持一致,但每周仍然有人导出 CSV、上传到某处,然后点击打印。本指南的目标就是让这个人从流程中消失。
读完本文后,你将拥有一个可重复的流水线:一个作为数据源的表格、一个在 RSJ LPSNG 中映射到你的列的标签设计,以及一个在数据发生变化时提交打印任务(发送到打印机、PDF 或 PNG)的触发器。RSJ LPSNG(lpsng.rsj.de)是连接两端的托管标签设计与打印平台:它提供用于交互式使用的 Google Sheets 加载项和用于自动化的 Web 服务 API,因此你再也不需要手动接触打印路径。
本文面向需要重复性标签(产品标签、运输标签、按订单定制的标签)的开发者和管理电子表格的高级用户,而非一次性打印。
前提条件
在开始之前,请确保你具备:
- 一个 Google 账号,可访问 Google Sheets 并有权安装加载项。
- 一个 RSJ LPSNG 账号(云端版或嵌入式版),可访问标签设计工作室和 Google Sheets 加载项。
- 对 Google Sheets 函数有基本了解。Google Apps Script 知识是可选的,但实现完全自动化则需要。
- 在表格中整理好的标签数据:每行一个标签,列对应标签所需的字段。
- 对于 API 驱动的自动化:LPSNG Web 服务的 OAuth2 凭据。请参阅 OAuth2 文档了解简化注册流程。
第 1 步:将 Google 表格准备为数据源
从数据开始,而不是从设计开始。一个可预测的表格能让下游的一切都变得无聊——这是好事。
使用单个标题行和每行一个标签的结构:
| SKU | ProductName | Price | Barcode |
|---|---|---|---|
| RSJ-1001 | Espresso Beans 250 g | 8.90 | 4006381333931 |
| RSJ-1002 | Filter Papers 100 pcs | 4.50 | 4006381333948 |
几条能节省后续时间的规则:
- 一行 = 一个标签。 不要合并单元格;合并单元格会破坏 Apps Script 中的范围读取。
- 列类型保持一致。 如果
Price是数字,就保持为数字。混合类型会在标签上产生不可预测的格式。 - 标题名称就是你的字段名称。 你会将标签字段绑定到这些标题,因此
ProductName比Name(带尾随空格)更好。 - 将查找数据分开存放。 如果产品主数据或价格表位于另一个标签页或范围中,请保持在那里,并在读取时进行连接。LPSNG 的 Excel 接口支持用于电子表格驱动打印的查找文件,同样的关注点分离原则也适用于 Sheets。
- 使用命名范围来标记数据块(例如
LabelData),如果你打算对其编写脚本。它比A2:E500更能承受行插入。
第 2 步:在 LPSNG 中设计你的标签
打开 LPSNG 标签工作室并创建新布局——如果现有模板与你的标签纸匹配,也可以从模板开始。
然后绑定字段:
- 将一个文本元素拖到画布上,并将其绑定到
ProductName列。 - 为
Price添加另一个元素,并按照你希望它在物理标签上显示的方式进行格式化。 - 添加条形码或二维码元素,并将其绑定到
Barcode。RSJ LPSNG 支持一维和二维条形码格式——完整列表见条形码格式文档。 - 保存设计并记下标签 ID 或名称。这是你将传递给加载项和 API 的句柄。
可选但有用:字段脚本 API 允许你将 Python 脚本块附加到字段,以便在打印前转换值——去除空白、将 SKU 转为大写,或连接名称和变体。确切的对象名称和方法记录在 Python API 下;字段脚本的大致形式如下:
# 仅供参考——真实对象名称请参阅字段脚本 API 文档。
value = field.value.strip()
field.value = value.upper()
将格式化逻辑保留在标签设计中意味着你的表格保持干净数据,打印输出保持一致。
第 3 步:使用加载项将 Google Sheets 连接到 LPSNG
此步骤在自动化之前验证整个路径是否可行。
- 从 Google Workspace Marketplace 安装 RSJ LPSNG Google Sheets 加载项。
- 打开你的数据表格,并从 扩展程序 菜单启动加载项。
- 在提示时对你的 LPSNG 账号进行身份验证。这会运行 OAuth2 流程——与 OAuth2 文档中描述的简化注册协议相同。
- 选择你在第 2 步中保存的标签设计。
- 将表格列映射到标签字段。如果你的标题与字段绑定匹配,这主要是一个确认步骤。
- 为选定的几行打印或导出标签。
如果这能生成正确的标签,说明映射是正确的。接下来两步中的所有内容只是在没有人工在场的情况下调用相同的操作。
笨办法:手动将表格导出为 CSV,上传到打印队列,每次更改都重复。LPSNG 用一个加载项操作——或一次 API 调用——取代了这一切。
第 4 步:使用触发器或 Web 服务 API 自动化打印
对于定时或事件驱动的打印,请从 Google Apps Script 转向 LPSNG Web 服务 API。该 API 提交打印任务、将单个标签渲染为 PDF 或 PNG,并可以直接将任务发送到打印机。
首先,确认你将如何获取令牌。LPSNG 的 OAuth2 模型使用简化的注册协议,旨在通过单个 URL 连接外部系统——请查看 OAuth2 文档,了解你的账号使用的确切令牌请求。
然后将提交包装在一个函数中。端点路径和负载模式在 Web 服务接口文档中定义;下面的结构展示了调用的形式。
// 常量——请替换为 Web 服务接口文档中的值
const LPSNG_API_BASE = 'https://<your-lpsng-instance>';
const PRINT_ENDPOINT = '<path from the Webservice Interface docs>';
const LABEL_ID = 'product-label-a4';
function getAccessToken() {
// OAuth2 令牌获取——请参阅 OAuth2 文档。
// 缓存令牌;不要为每个标签请求新令牌。
return PropertiesService.getScriptProperties().getProperty('LPSNG_ACCESS_TOKEN');
}
function submitLabels(rows) {
const payload = {
label: LABEL_ID,
// 每个要打印的标签对应一个条目
data: rows.map(r => ({
ProductName: r.ProductName,
Price: r.Price,
Barcode: r.Barcode
})),
output: 'pdf' // 渲染为 PDF/PNG,或直接发送到打印机
};
const res = UrlFetchApp.fetch(LPSNG_API_BASE + PRINT_ENDPOINT, {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + getAccessToken() },
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
return JSON.parse(res.getContentText());
}
如果你更愿意将打印步骤保留在本地并可通过脚本执行,LPSNG Player 是一个独立的命令行打印引擎:输入包加数据,输出 PDF/PNG/JSON/打印/ESL。它是相同的标签包,只是从 shell 驱动而不是 HTTP 调用。
# LPSNG Player——输入包 + 数据,输出结果
lpsng-player --package product-label.lps --data rows.json --output labels.pdf
第 5 步:设置重复性自动化(时间驱动或编辑时触发)
现在附加触发器。两种模式覆盖大多数情况。
时间驱动——每小时检查新行。适用于批处理导向的工作流,几分钟的延迟是可以接受的。
function installHourlyTrigger() {
ScriptApp.newTrigger('printNewRows')
.timeBased()
.everyHours(1)
.create();
}
编辑时触发——在添加或更改行时立即打印。适用于有人在等待输出的按订单定制标签。
function onEditHandler(e) {
const sheet = e.range.getSheet();
if (sheet.getName() !== 'Labels') return;
if (e.range.getRow() === 1) return; // 忽略标题行
printNewRows();
}
两者都调用同一个工作函数,你需要在这里处理幂等性。最简单可靠的机制是状态列:
const SHEET_NAME = 'Labels';
const STATUS_COL = 5; // E 列:空白或 "pending" / "printed"
function printNewRows() {
const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
const values = sheet.getDataRange().getValues();
const header = values.shift();
const pending = [];
values.forEach((row, i) => {
const status = row[STATUS_COL - 1];
if (!status || status === 'pending') {
pending.push({
rowNumber: i + 2,
data: Object.fromEntries(header.map((h, c) => [h, row[c]]))
});
}
});
if (!pending.length) return;
const result = submitLabels(pending.map(p => p.data));
// 根据你的 API 版本返回的响应字段调整此检查。
if (result && result.error) {
MailApp.sendEmail('ops@example.com', 'LPSNG print job failed',
JSON.stringify(result));
return;
}
pending.forEach(p => sheet.getRange(p.rowNumber, STATUS_COL).setValue('printed'));
}
对于更大的量,将行批量合并到单个 API 调用中,而不是每行循环一次请求,并让 LPSNG 任务队列管理和监控生成的打印任务。
第 6 步:验证和监控你的自动化打印
你不关注的自动化就是你不信任的自动化。四项检查让它保持诚实:
- 任务队列。 查看 LPSNG 任务队列,确认每个任务成功提交和完成。
- 输出检查。 打开生成的 PDF 或 PNG,并将其与源行进行比较——尤其是条形码值和价格格式。
- 状态列。 标记为
printed的行已处理;留空或pending的行未处理。这既是你的进度指示器,也是你的重复防护。 - 错误通知。 将 API 调用包装在错误处理中,并在失败时给自己发送邮件。对于小量,Apps Script 的
MailApp就足够了;当某些东西静默停止时,请查看 Apps Script 编辑器 执行记录 下的执行日志。
常见问题排查
身份验证错误。 令牌会过期。确保你的脚本刷新它们,而不是重用过期值,确认作用域与 Web 服务要求匹配,如果你更改了账号,请重新验证加载项。
数据映射问题。 列标题必须与标签设计中的字段绑定匹配。重命名的标题是空白字段最常见的原因。还要检查空值或格式错误的值——空的条形码单元格会产生不可读的符号。
打印任务失败。 确认打印机可达,并在 LPSNG 中选择了正确的打印机。对于云打印场景,请验证云打印文档中描述的热敏打印机变通方案已配置。
重复标签。 始终通过状态列或每行的唯一任务 ID 来限制提交。编辑时触发器加上没有防护的重试会愉快地打印同一个标签两次。
性能。 批量请求,避免在短时间内触发大量任务,并使用任务队列来平滑峰值,而不是猛击 API。
常见问题
从 Google Sheets 设置自动标签打印需要是开发者吗? 不一定。RSJ LPSNG Google Sheets 加载项提供了一种从表格打印标签的无代码方式。但是,对于完全自动化——定时或事件驱动的打印——需要一些使用 Google Apps Script 和 LPSNG Web 服务 API 的脚本编写。该 API 使用 OAuth2 和 JSON,因此基本的开发技能会有帮助。
我可以直接从 Google Sheets 打印到物理打印机吗? 可以,通过 RSJ LPSNG。该平台可以直接将打印任务发送到打印机,包括热敏打印机。对于云打印场景,LPSNG 提供了将热敏打印机与 Google Cloud Print 配合使用的变通方案。你也可以将标签渲染为 PDF 或 PNG 进行手动打印。
支持哪些标签格式和条形码类型? RSJ LPSNG 支持广泛的一维和二维条形码格式。你可以在标签工作室中设计带有文本、条形码和其他元素的标签。支持的条形码格式的确切列表可在 LPSNG 文档的条形码格式下找到。
自动打印的标签数量有限制吗? 限制取决于你的 LPSNG 版本和部署。云解决方案是多用户且可扩展的,而嵌入式版本在单板计算机上运行。对于大批量自动化,任务队列有助于管理打印任务。请查看具体版本详情以了解任何限制。
结论:简化你的标签打印工作流
完整的流水线有六个步骤:构建表格、设计标签、通过加载项连接、自动化提交、附加触发器、验证输出。一旦就位,新的电子表格行就会变成打印好的标签,没有导出步骤,也没有复制粘贴——而状态列会准确告诉你每一行发生了什么。
RSJ LPSNG 正是为这种重复性工作而构建的。由于它是托管服务,打印路径——渲染、任务队列、打印机调度——都由平台为你处理,同一个标签设计可在云端、嵌入式和企
