← All posts

2026-09-14

如何从 Google Sheets 自动打印标签

如何从 Google Sheets 自动打印标签
pdf labels barcodes label merge browser based graphical layout editor google sheets addin microsoft excel addon electronic shelf labels esl barcode3 labels label editor

如何从 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 标签工作室并创建新布局——如果现有模板与你的标签纸匹配,也可以从模板开始。

然后绑定字段:

  1. 将文本元素拖到画布上,并将其绑定到 ProductName 列。
  2. 为 Price 添加另一个元素,并按照你希望它在实体标签上显示的方式来格式化。
  3. 添加条形码或二维码元素,并将其绑定到 Barcode。RSJ LPSNG 同时支持一维和二维条码格式——完整列表见条码格式文档。
  4. 保存设计并记下标签 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

这一步在自动化之前先验证整条路径是否可行。

  1. 从 Google Workspace Marketplace 安装 RSJ LPSNG Google Sheets 加载项。
  2. 打开你的数据表,从 Extensions 菜单启动加载项。
  3. 在提示时对你的 LPSNG 账号进行身份验证。这会走 OAuth2 流程——与 OAuth2 文档中描述的简化注册协议相同。
  4. 选择你在第 2 步保存的标签设计。
  5. 将你的表格列映射到标签字段。如果你的标题与字段绑定匹配,这基本上是一个确认步骤。
  6. 为选中的几行打印或导出标签。

如果这能生成正确的标签,说明映射是正确的。接下来两步中的一切,只是在没有人在场的情况下调用相同的操作。

笨办法:手动将表格导出为 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。两者都在产品网站上有所记录。

相关文章

EU label: AI-generated content