マキモノ
Google Workspace無料✅ 公式検証済みv1.0.0 / 更新

GAS Webアプリ バーコードラベル印刷(iOS AirPrint対応)

Google Apps ScriptのWebアプリからBrother等のラベルプリンタへ印刷する際、iOS AirPrintが連続ロールのカット長を無視する問題をjsPDF生成で回避する実装パターン

出品者: miho.furukawa0430@gmail.com2 DL📖 読込 約1,950トークン (約3円)💰 コスパ 2
トークン節約メーター80%節約
ゼロからAIに作らせた場合6,000トークン
このMDを読ませた場合1,200トークン

4,800トークンの節約 (API料金換算で約7円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。

この巻物について

GAS Webアプリ バーコードラベル印刷(iOS AirPrint対応)」は、Google WorkspaceカテゴリのAI指示書(MDファイル)です。Google Apps ScriptのWebアプリからBrother等のラベルプリンタへ印刷する際、iOS AirPrintが連続ロールのカット長を無視する問題をjsPDF生成で回避する実装パターンこの巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約4,800トークン(API料金換算で約7円)・80%のトークンを節約できます。

カテゴリ
Google Workspace
対応AI
claude-code、cursor、codex-cli
ライセンス
商用利用可 (再販不可)
価格
無料
ゼロから開発時
約6,000トークン
この巻物使用時
約1,200トークン
節約量
約4,800トークン (約7円)
更新日
2026-08-24

使い方 (AIに渡す3つの方法)

いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。

⬇ .md をダウンロード
claude "https://makimono-md.vercel.app/api/v1/files/gas-web-ios-airprint/raw を読み込んで、この指示書どおりに実装して"
claude-codecursorcodex-cliライセンス: 商用利用可 (再販不可)

中身

Google Apps Script Webアプリからのバーコードラベル印刷(iOS AirPrint対応)

問題

Google Apps Script(GAS)のHtmlService Webアプリから、Brotherなどの感熱ラベルプリンタ(例: QL-820NWB)でバーコードシールを印刷する機能を作ると、以下の問題に必ずぶつかる。

  1. iOS Safari + AirPrintは、印刷対象HTML/CSSの@page { size: Wmm Hmm }を尊重しない。特に連続ロール(切れ目のないラベル紙)を使っていると、CSSで指定したサイズを無視して長い/短いカット長で印刷され、内容が縮小されたり中央に小さく配置されたりする。
  2. Mac/PCのブラウザの共有シートには「プリント」がないため、iOSと同じnavigator.share()だけでは印刷導線を統一できない。
  3. window.print()ベースの実装は、印刷対象ページのCSSに依存しすぎて端末ごとに挙動が割れる。

解決策: PDFを生成してから印刷に渡す

CSSでの印刷ではなく、クライアント側でCanvas→PNG→jsPDFでページサイズ確定済みのPDFを都度生成し、それを印刷に渡す。PDFはページサイズ情報を自身で持つため、AirPrint側もそのサイズを正しく認識する。

<script src="https://cdn.jsdelivr.net/npm/jspdf@2.5.1/dist/jspdf.umd.min.js" defer></script>
// ラベル1枚をCanvasに描画(バーコード+テキスト)
function buildLabelCanvas(code, line2, line3) {
  var PX = 12; // 1mmあたりpx(約300dpi相当)
  var W = 29 * PX, H = 42 * PX; // ラベル実寸(mm)に合わせる
  var canvas = document.createElement('canvas');
  canvas.width = W; canvas.height = H;
  var ctx = canvas.getContext('2d');
  ctx.fillStyle = '#fff'; ctx.fillRect(0, 0, W, H);

  var bc = document.createElement('canvas');
  JsBarcode(bc, String(code), { format: 'CODE128', width: 4, height: 130, displayValue: false, margin: 0 });
  var bw = Math.min(bc.width, W * 0.92);
  ctx.drawImage(bc, (W - bw) / 2, 2 * PX, bw, 11 * PX);

  ctx.fillStyle = '#000'; ctx.textAlign = 'center';
  ctx.font = 'bold ' + (4 * PX) + 'px sans-serif';
  ctx.fillText(String(code), W / 2, 18 * PX);
  // line2/line3 は複数行折返しして描画(省略)

  return canvas;
}

// 指定枚数分のPDFを生成し、iOSは共有シート、PC/Macは新規タブでCmd+P
function printLabels(code, line2, line3, copies) {
  var png = buildLabelCanvas(code, line2, line3).toDataURL('image/png');
  var doc = new window.jspdf.jsPDF({ orientation: 'portrait', unit: 'mm', format: [29, 42] });
  for (var i = 0; i < copies; i++) {
    if (i > 0) doc.addPage([29, 42], 'portrait');
    doc.addImage(png, 'PNG', 0, 0, 29, 42);
  }
  var blob = doc.output('blob');
  var file = new File([blob], 'label.pdf', { type: 'application/pdf' });
  var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) ||
              (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);
  if (isIOS && navigator.canShare && navigator.canShare({ files: [file] })) {
    navigator.share({ files: [file], title: 'ラベル ' + code }); // 共有シート→「プリント」
  } else {
    window.open(URL.createObjectURL(blob), '_blank'); // PC/Mac: 新規タブ→Cmd/Ctrl+P
  }
}

重要な前提: ラベルロールは切れ目入り(ダイカット)を使う

連続ロール(切れ目のない長尺ラベル)はiOS/AirPrint経由ではカット長を正しく制御できない。PDFのページサイズを正確に指定しても、AirPrintがカット長を無視するケースが実際に発生した(本文サイズが縦横入れ替わったり、間延びしたりする)。

  • 切れ目入り(ダイカット)ラベルロールに交換すると、プリンタ自体がラベル1枚単位でカット・送りを行うため、この問題が発生しなくなる。
  • 応急処置として「PCからのみ印刷可」に限定する選択肢もあるが、根本解決はロールの交換。

横向きレイアウトが必要な場合の90度回転Tips

棚番号ラベルなど「バーコードを長辺方向いっぱいに使いたい」場合は、横長キャンバスに描画してから90度回転させて縦長ページに収めると、レイアウトの無駄なく印刷できる。

function rotateCanvas90(src) {
  var out = document.createElement('canvas');
  out.width = src.height; out.height = src.width;
  var ctx = out.getContext('2d');
  ctx.translate(out.width / 2, out.height / 2);
  ctx.rotate(Math.PI / 2);
  ctx.drawImage(src, -src.width / 2, -src.height / 2);
  return out;
}

範囲指定での一括ラベル生成(連番展開)

「開始コード〜終了コード」の範囲入力から、差分のある桁だけを自動展開して複数枚をまとめて1回の印刷ジョブにする実装も有用(例: A3-1-1-1〜A3-1-4-5 → 3桁目1-4×4桁目1-5の20件を自動生成)。開始・終了で数字が異なる桁を検出し、桁の幅(ゼロ埋め)を保ったまま総当たりで展開する。誤入力による大量印刷を防ぐため、展開後の件数に上限(例: 200件)を設けること。

適用範囲

  • Google Apps Script(HtmlService Webアプリ)からの現場向けラベル印刷全般
  • JsBarcode + jsPDFの組み合わせはCDN経由で追加でき、ライブラリのインストール作業が不要
  • Brother QL-8xxシリーズに限らず、感熱ラベルプリンタ全般でAirPrint経由印刷を行う場合に応用可能

よくある質問

「GAS Webアプリ バーコードラベル印刷(iOS AirPrint対応)」とは何ですか?

Google Apps ScriptのWebアプリからBrother等のラベルプリンタへ印刷する際、iOS AirPrintが連続ロールのカット長を無視する問題をjsPDF生成で回避する実装パターン

どれくらいトークン(費用)を節約できますか?

ゼロから開発すると約6,000トークンかかりますが、この巻物を使えば約1,200トークンで済みます。差し引き約4,800トークン(API料金換算で約7円)・80%の節約です。

どうやって使いますか?

無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。

どのAIツールに対応していますか?

claude-code、cursor、codex-cli に対応しています。

商用利用できますか?

ライセンスは「商用利用可 (再販不可)」です。

🤝 自分でAIを動かすのは、まだ不安…という方へ

この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。

AI代行堂を見る →

関連する巻物

この巻物、誰かのトークンも救えます

𝕏 で節約レシートをシェア