GAS Webアプリ バーコードラベル印刷(iOS AirPrint対応)
Google Apps ScriptのWebアプリからBrother等のラベルプリンタへ印刷する際、iOS AirPrintが連続ロールのカット長を無視する問題をjsPDF生成で回避する実装パターン
約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 のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/gas-web-ios-airprint/raw を読み込んで、この指示書どおりに実装して"
中身
Google Apps Script Webアプリからのバーコードラベル印刷(iOS AirPrint対応)
問題
Google Apps Script(GAS)のHtmlService Webアプリから、Brotherなどの感熱ラベルプリンタ(例: QL-820NWB)でバーコードシールを印刷する機能を作ると、以下の問題に必ずぶつかる。
- iOS Safari + AirPrintは、印刷対象HTML/CSSの
@page { size: Wmm Hmm }を尊重しない。特に連続ロール(切れ目のないラベル紙)を使っていると、CSSで指定したサイズを無視して長い/短いカット長で印刷され、内容が縮小されたり中央に小さく配置されたりする。 - Mac/PCのブラウザの共有シートには「プリント」がないため、iOSと同じ
navigator.share()だけでは印刷導線を統一できない。 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で頼むだけで、仕事が完成」。
関連する巻物
GAS完全自動化テンプレ — Driveコマンドキュー方式
Google Apps Script の「毎回エディタで▶実行」を根絶。Drive 経由のコマンドキューで、初回1クリック以降は AI がすべての GAS 関数をリモート実行できるようになるテンプレート指示書。
人間の手入力台帳を壊さずに自動更新する — GAS Web App upsert 設計
各PC/各拠点の点検結果を、人間が手運用しているスプレッドシート台帳へ自動反映する。手入力列とコメントを絶対に壊さない突合設計、タブ/列の解決、並行POST対策、配布シークレットの落とし穴まで。
数式まみれの業務スプレッドシートを、Webアプリから壊さずに編集させる型
ArrayFormula と per-row 数式が混在する台帳を、セル単位 allowlist・dry-run 既定・適用前バックアップ・触っていないセルの数式不変検査で安全に書き換える設計手順。列ごとの数式復元と、テストが緑のまま壊れる典型例つき。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア