如何从 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 Sheet 准备为数据源
从数据开始,而不是从设计开始。一个可预测的表格能让下游的一切都变得无聊——这是好事。
用单个标题行和每行一个标签来组织它:
| 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 的句柄。
可选但有用:Field Script API 允许你将 Python 脚本块附加到字段上,以便在打印前转换值——去除空白、将 SKU 转为大写,或拼接名称与变体。确切的对象名称和方法记录在 Python API 下;字段脚本的大致形式是:
# Illustrative only — see the Field Script API docs for the real object names.
value = field.value.strip()
field.value = value.upper()
将格式逻辑保留在标签设计中,意味着你的表格保持干净的数据,打印输出保持一致。
第 3 步:使用加载项将 Google Sheets 连接到 LPSNG
这一步在自动化之前先验证整条路径是否可行。
- 从 Google Workspace Marketplace 安装 RSJ LPSNG Google Sheets 加载项。
- 打开你的数据表,从 Extensions 菜单启动加载项。
- 在提示时对你的 LPSNG 账号进行身份验证。这会走 OAuth2 流程——与 OAuth2 文档中描述的简化注册协议相同。
- 选择你在第 2 步保存的标签设计。
- 将你的表格列映射到标签字段。如果你的标题与字段绑定匹配,这基本上是一个确认步骤。
- 为选中的几行打印或导出标签。
如果这能生成正确的标签,说明映射是正确的。接下来两步中的一切,只是在没有人在场的情况下调用相同的操作。
笨办法:手动将表格导出为 CSV,上传到打印队列,每次更改都重复一遍。LPSNG 用一个加载项操作——或一次 API 调用——取代了这一切。
第 4 步:使用触发器或 Web 服务 API 自动化打印
对于定时或事件驱动的打印,从 Google Apps Script 转向 LPSNG Web 服务 API。该 API 提交打印任务、将单个标签渲染为 PDF 或 PNG,并可将任务直接发送到打印机。
首先,确认你将如何获取令牌。LPSNG 的 OAuth2 模型使用简化的注册协议,旨在通过单个 URL 连接外部系统——请查看 OAuth2 文档,了解你的账号使用的确切令牌请求。
然后,将提交包装在一个函数中。端点路径和负载模式定义在 Webservice Interface 文档中;下面的结构展示了调用的形式。
// Constants — replace with the values from the Webservice Interface docs
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 token acquisition — see the OAuth2 documentation.
// Cache the token; do not request a new one per label.
return PropertiesService.getScriptProperties().getProperty('LPSNG_ACCESS_TOKEN');
}
function submitLabels(rows) {
const payload = {
label: LABEL_ID,
// One entry per label to print
data: rows.map(r => ({
ProductName: r.ProductName,
Price: r.Price,
Barcode: r.Barcode
})),
output: 'pdf' // render to PDF/PNG, or send straight to a printer
};
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 — package + data in, output out
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; // ignore the header row
printNewRows();
}
两者都调用同一个工作函数,你在这里处理幂等性。最简单可靠的机制是状态列:
const SHEET_NAME = 'Labels';
const STATUS_COL = 5; // column E: blank or "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));
// Adjust this check to the response fields your API version returns.
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 编辑器 Executions 下的执行日志。
常见问题排查
身份验证错误。 令牌会过期。确保你的脚本刷新它们,而不是重用过期值,确认作用域与 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 正是为这类周期性工作而构建的。由于它是托管服务,打印路径——渲染、任务队列、打印机调度——都为你处理好了,同一个标签设计可在云端、嵌入式和 Enterprise 版本中通用,取决于你需要它在哪里运行。
从 Google Sheets 加载项开始,在少量行上验证你的映射,然后在准备移除手动触发器时转向 Web 服务 API。两者都在产品网站上有所记录。
相关文章
