前回の記事 では、QR コード付きの資産ラベルを作りました。今回は、現場の写真を添付ファイルから並べる、空調設備の点検報告書を作ります。
下は、写真を 10 枚添付したレコードから出した報告書です。1 ページ目に点検項目の表、2 ページ目以降に写真を 6 枚ずつ並べ、写真の枚数に応じてページが増えます。作った PDF はレコードの添付ファイルに保存され、「発行日時」も入ります。
最初の版は、写真の説明をファイル名から作りました。その後、現場での運用を考えて、点検項目の行に写真を添付する形に作り直しました(7 章)。
今回は、シリーズでまだ扱っていない次の 3 つを使います。
-
添付ファイルの画像: レコードに添付した写真を、帳票に並べる(
IMGSRC) -
写真の枚数で増えるページとページ番号:
#{&p} / #{&n}で「2 / 3」のように出す - PDF の保存と項目の更新: PDF をレコードの添付ファイルに保存し、「発行日時」を更新する
もう 1 つ、今回はテスト用の現場写真も AI に用意させました。
| # | 頼んだこと | 結果 |
|---|---|---|
| 1 | テスト用画像を用意できるか? |
AI が現場写真を 6 枚描いた |
| 2 |
画像が分かりにくい ファイル添付は、REST API で直接アップロードして
|
工事黒板を入れて描き直した。REST API は AI の環境から kintone につながらなかった |
| 3 | ファイルアップロードは手動で行う |
点検報告書アプリとテストデータ 2 件ができた |
| 4 |
OK(写真を手で添付した後) |
報告書の設定ができた |
| 5 | (PDF 2 つのパス) | 写真・集計・保存・発行日時を確かめた |
| 6 | (写真 10 枚の PDF のパス) | 写真のページが増えることを確かめた |
| 7 |
実際に運用するには、課題がある 写真のファイル名を説明に変更は、実用的でない
|
写真と説明のテーブルを足した |
| 8 |
点検項目のテーブルに添付ファイルがある方が良いのでは? → OK
|
点検項目に写真の列を足し、設定を作り直した |
| 9 | (PDF のパス、3 回) | 前の設定のままだったこと、説明の崩れに気付いて直した |
かかった時間は、最初の版が約 21 分(頼んでから、写真 10 枚の PDF を確かめるまで)、翌朝の運用を考えた作り直し(7 章)が約 30 分でした。
| 区切り | 時刻 | かかった時間 |
|---|---|---|
| テスト用の写真を用意(2 回) | 23:46〜23:50 | 約 4 分 |
| アプリの作成、写真の添付(手作業) | 23:50〜23:56 | 約 6 分 |
| 報告書の設定 → 2 件の PDF を確かめる | 23:56〜0:02 | 約 6 分 |
| 写真 10 枚のレコードで確かめる | 0:02〜0:07 | 約 5 分 |
| 合計 | 23:46〜0:07 | 約 21 分 |
時刻は、頼んだ時刻と、画像と PDF の作成日時、kintone のアプリの作成日時から取りました。最初の報告書の設定は、指定した仕様どおりに一度で出ました。前回までのつまずき(番号は 1 から数える、寸法の単位)を、AI が最初から避けて書いたためです。ただし、現場での入力方法まで考えると改善すべき点があり、翌朝にアプリの項目から作り直しました(7 章)。
拡張機能(印刷屋 設定オーサリング)の入れ方と、帳票を最初に作る手順は 最初の記事 を見てください。アプリを作る手順では、kintone MCP サーバーも使います。
1. テスト用の写真を AI に用意させる
写真を並べる帳票は、写真が無いと試せません。実在の写真を探してくると権利の確認が要るので、AI に描かせました。
1 テスト用画像を用意できるか?
AI は、空調設備の定期点検を想定した 6 枚(室外機、フィルターの清掃前と清掃後、分電盤、ドレンパン、リモコン)を Python で描き、ダウンロードのフォルダーに置きました。右下には、工事用のカメラのように撮影日時を入れています。
ところが、何の写真か分かりにくいものでした。
画像が分かりにくい
AI は 2 つの手を打ちました。1 つは、日本の現場写真でよく使う工事黒板(件名・場所・箇所・内容・日付)を各写真に写し込み、何の写真かを文字で分かるようにしたこと。もう 1 つは、形で分かりにくいドレンパンと分電盤を、圧力計と温度計に替えたことです。
どの写真にも「SAMPLE(テスト用の描画)」と入れて、本物の写真と取り違えないようにしています。1 枚は 1600 × 1200px、250KB ほどの JPEG で、スマホで撮った写真に近い大きさと比率です。
2. 写真の添付は手作業にした
kintone MCP サーバーは、添付ファイル項目への登録に対応していません(ツールの説明に「FILE fields are not supported yet」とあります)。そこで、REST API で直接アップロードするように頼みました。
ファイル添付は、REST API で直接アップロードして
AI は、自分が使える 2 つの環境(クラウドの作業環境と、PC の上の作業環境)から kintone につながるかを試し、どちらもネットワークの許可の範囲外で止められることを確かめました。そのうえで、「アップロードのスクリプトを作り、利用者が自分の PC で API トークンを環境変数で渡して実行する」方法を提案しました。トークンを AI に見せずに済む方法です。
今回は写真が 6 枚だけなので、手で添付することにしました。
ファイルアップロードは手動で行う
3. 点検報告書アプリを作る
AI は kintone MCP サーバーで、これまでと同じスペースに「点検報告書(印刷屋)」を作りました。
| 項目 | 型 | 使い道 |
|---|---|---|
| 報告書番号 | 文字列(1行・必須・重複不可) | 見出し、ファイル名 |
| 点検日・顧客名・物件名・点検者 | 日付・文字列 | 見出しと宛先 |
| 点検項目(テーブル) | 機器・項目・結果(良 / 要注意 / 不良)・測定値・備考 | 1 ページ目の表と集計 |
| 総合所見 | 文字列(複数行) | 1 ページ目 |
| 点検写真 | 添付ファイル | 2 ページ目以降 |
| 報告書 | 添付ファイル | PDF の保存先 |
| 発行日時 | 日時 | PDF を作った日時 |
テストデータは 2 件です。1 件目は点検項目 7 行で「要注意」が 1 行、2 件目は 2 行で「不良」が 1 行です。1 件目の点検項目は、写真の黒板と同じ機器・測定値(低圧 0.85MPa、吹出 14.2℃ など)にしています。
写真は、1 件目に 6 枚、2 件目に 2 枚を手で添付しました。写真の枚数が違うレコードを用意しておくと、写真のページの出方を比べられます。
下は、写真を 10 枚添付したレコード(6 章で使う 3 件目)の画面です。
4. 報告書を組み立てる
写真を添付した後、OK と伝えると、AI はアプリの項目定義とレコード 2 件(形だけ)を取り込み、報告書の設定を作りました。
1 ページ目
1 ページ目は HTML テンプレートで書き、点検の結果の集計(##summary##)と点検項目の表(##items##)だけを計算式で差し込みます。
集計は、点検項目の行から結果ごとの件数を数えています。
LET(cnt, ARRAY_MAP(ARRAY("良", "要注意", "不良"), vC,
ARRAY_COUNT(ARRAY_FIL(rows, vR, DIC_ITEM(vR, "res") = vC))), …)
表の「結果」は、良は緑、要注意は橙、不良は赤のバッジにしています。バッジの class は IF で 3 つの決まった名前から選ぶので、検査では formula.attr(属性に式を入れている)の警告が出ます。入るのは決まった class 名だけなので、AI は警告を残したまま伝えました。
写真のページ
写真のページは計算式で組み立て、1 ページ目の後ろにつなぎます。前回の資産ラベルと同じく、ページと写真の番号は 1 から数えています。
LET(n, ARRAY_COUNT(FILE(点検写真, "name")), // 写真の枚数
ARRAY_MAP(ARRAY_FOR(ROUNDUP(n / 6, 0), vI, vI + 1), vP, // 写真のページ 1, 2, …
PAGE_HTML(…
ARRAY_MAP(ARRAY_FIL(ARRAY_FOR(n, vJ, vJ + 1), vS,
ROUNDUP(vS / 6, 0) = vP), vS2, // 写真の番号 1〜n
TAG("div", ATTR("class", "rp-ph"),
VTAG("img", ATTR("class", "rp-ph-img", "src", IMGSRC(点検写真, vS2 - 1))),
TAG("div", ATTR("class", "rp-ph-cap"), TAG("span", vS2), …写真の説明…)))
…)))
IMGSRC(添付ファイル, 位置) は、添付ファイルの画像を表す置き換えタグ(#{&f(fileKey)})を返します。PDF を作るときに、印刷屋がこのタグを実際の画像に置き換えます。式の上では、写真が 0 枚なら写真のページは作られず、7 枚以上ならページが増えます。
写真の説明はファイル名から
写真ごとに説明を入力する項目は作らず、ファイル名から説明を作りました。先頭の番号と拡張子を除き、_ を空白にします。
REPLACE(REPLACERE(REPLACERE(FILE(点検写真, "name", vS2 - 1),
"[.][A-Za-z0-9]+$", ""), // 拡張子を除く
"^[0-9]+_", ""), // 先頭の番号を除く
"_", " ") // _ を空白に
02_フィルター_清掃前.jpg は「フィルター 清掃前」になります。並び順は添付した順なので、ファイル名の番号の順に添付します。
この方法は現場の手間が多いので、7 章で、点検項目の行に写真を添付する形に作り直します。
ページ番号
各ページの下に #{&p} / #{&n} を書くと、「1 / 2」「2 / 2」のように出ます。HTML テンプレートの 1 ページ目と、計算式で作った写真のページのどちらでも、総ページ数まで正しく数えられていました。
5. PDF を保存し、発行日時を入れる
ボタンを押すと、確認の後に PDF を作り、「報告書」項目に保存します。そのうえで、更新項目の計算式で「発行日時」に作った日時を入れます。
"filecode": "報告書",
…
"calcInfo": {
"fieldsInfo": [
{ "state": true, "fieldcode": "$out", "formulaSet": "1" },
{ "state": true, "fieldcode": "発行日時", "formulaSet": "NOW()" }
]
}
AI は kintone MCP サーバーでレコードを読み、「報告書」に PDF(ダウンロードしたものと同じ大きさ)が保存され、「発行日時」が入っていることを確かめました。今回試した範囲では、PDF の保存と「発行日時」の更新はいつもそろっていました。
ボタンは、PDF を保存した後も出るままにしています。押し直すと、「報告書」に PDF が追加され、前の版も残ります。
2 件目(写真 2 枚、「不良」1 行)の報告書です。
6. 写真が増えたとき
最後に、写真を 10 枚添付したレコードで試しました(冒頭の画像)。写真のページが 2 ページになり、全体で 3 ページです。写真の番号はページをまたいで 7〜10 と続き、ページ番号も「1 / 3」〜「3 / 3」と正しく出ました。
7. 運用を考えて作り直す
報告書はできましたが、現場で使うことを考えると問題がありました。
実際に運用するには、課題がある
写真のファイル名を説明に変更は、実用的でない
テーブル行に1画像と説明文がある方が現場で入力しやすい
ファイル名から説明を作る方法では、点検者が写真の名前を 1 枚ずつ付け直し、番号の順に添付する必要があります。スマホで撮った写真は IMG_1234.jpg のような名前なので、現場の手間が増えます。
写真と説明のテーブル
AI はまず、写真(添付ファイル)と説明(文字列)を 1 行に持つテーブル「写真記録」をアプリに足し、写真のページをその行から組むように直しました。
点検項目の行に写真を添付する
これを見て、もう一歩進めることにしました。
点検項目のテーブルに添付ファイルがある方が良いのでは?
AI はこの案に賛成し、良くなる点と、先に決めておく点を挙げました。
良くなる点:
- 現場では、点検項目の 1 行に結果・測定値・写真をまとめて入力できる
- 説明を入力しなくてよい。説明は、その行の No・機器・項目・結果・測定値から作れる
- 1 ページ目の表に写真の番号を出せば、表と写真を照らし合わせられる
- 行を行番号で区別するので、機器・項目・測定値が同じ行が 1 つにまとまる問題(前の版の注意点)もなくなる
決めておく点:
- 1 行に複数枚: フィルターの清掃前と清掃後のような写真は、同じ行に添付する。全部出し、説明に「(1/2)」「(2/2)」を付ける
- どの項目にも当たらない写真: 全景などは、結果を空にした行に添付する。その行は結果のバッジを出さず、件数にも数えない
OK と伝えると、AI は「写真記録」テーブルを消し、点検項目のテーブルに「写真」の列を足して、設定を作り直しました。
| 項目 | 変更 |
|---|---|
| 点検項目(テーブル) | 「写真」(添付ファイル)の列を追加 |
| 点検写真 | 残したが、報告書では使わない |
作り直した後のレコードの画面です。点検項目の各行に写真を添付します。フィルター清掃の行には、清掃前と清掃後の 2 枚を添付しています。
写真を 1 列に並べる
1 行に写真が何枚もあるので、写真に通し番号を付けるには、行ごとの写真を 1 列に並べる必要があります。配列を平らにする関数が見当たらなかったので、AI は「行 × 20 + 何枚目」という番号を全部作り、写真がある番号だけを残す方法にしました。1 行に添付できる写真は 20 枚までです。
LET(M, 20, …
LET(fl, ARRAY_FIL(ARRAY_FOR(ARRAY_COUNT(rows) * M, vX, vX), vX2,
vX2 - ROUNDDOWN(vX2 / M, 0) * M // その行の何枚目
< ARRAY_COUNT(DIC_ITEM(ARRAY_GET(rows, ROUNDDOWN(vX2 / M, 0)), "keys"))), // その行の枚数
…
fl の 1 つの値を 20 で割ると、商が行、余りがその行の何枚目です。
たとえば点検項目が 3 行で、写真が 2 枚・0 枚・3 枚なら、候補の番号は 0〜59 の 60 個です。このうち写真があるのは、1 行目の 0・1 と、3 行目の 40・41・42 だけなので、fl は [0, 1, 40, 41, 42] の 5 つになります。写真の通し番号 3 は fl の 3 つ目の 40 で、40 ÷ 20 の商 2 が 3 行目、余り 0 がその行の 1 枚目です。写真は、FILE(写真, "key") で取った fileKey から置き換えタグ #{&f(fileKey)} を作って表示します。1 ページ目の表の「写真」列は、fl のうちその行に当たる位置を集めて JOIN したものです。
1 件目のレコードでは、点検項目と写真が次のように対応します。
| No. | 点検項目 | 結果 | 添付した写真 | 写真の番号 |
|---|---|---|---|---|
| 1 | 外観・異音・振動 | 良 | 1 枚 | 1 |
| 2 | 冷媒圧力(低圧) | 良 | 1 枚 | 2 |
| 3 | 冷媒圧力(高圧) | 良 | 1 枚 | 3 |
| 4 | フィルター清掃 | 要注意 | 2 枚(清掃前・清掃後) | 4, 5 |
| 5 | 吹出温度 | 良 | 1 枚 | 6 |
| 6 | ドレン排水 | 良 | 0 枚 | なし |
| 7 | 運転確認 | 良 | 1 枚 | 7 |
写真の説明は、その行の値から 2 行で作ります。1 行目が写真の番号と「No.4 室内機 IU-2F-1/フィルター清掃(1/2)」、2 行目が結果のバッジと測定値です。
途中のつまずき
作り直しの途中で、3 つつまずきました。
空のドロップダウンで計算式が止まった: 全景の行のように「結果」を空にすると、試し出力で計算式がエラーになりました。試し出力は、レコードの値が入りうるのでエラーの文を返しません。AI は式を小さく切った診断用の設定を作って順に試し出力し、原因を絞り込みました。値を直接見られないところは、値の数だけページを足し、ページ数で値を確かめました。今回の試し出力では、未選択のドロップダウンが "" ではなく null として扱われ、計算式の評価に失敗していました。ESC_HTML(結果) で空文字列に変換すると、正しく動きました。
前の設定のまま PDF を作っていた: 1 回目の PDF は、印刷屋に前の設定が入ったまま作っていました。AI は、1 ページ目の表に「写真」列が無いことと、説明がファイル名のままであることから気付きました。
バッジが折り返すと文字が隠れた: 説明が長いと、「要注意」のバッジが行の途中で折り返し、PDF ではバッジの背景が行全体に塗られて、写真の番号と説明が隠れました。説明を 2 行に分け、どちらの行も折り返さないようにして直しました。
かかった時間
| 区切り | 時刻 | かかった時間 |
|---|---|---|
| 写真記録テーブル → 点検項目に写真の列、設定の作り直し | 8:34〜8:50 | 約 16 分 |
| 写真の添付(手作業)、PDF の確認、説明の崩れの修正 | 8:50〜9:04 | 約 14 分 |
| 合計 | 8:34〜9:04 | 約 30 分 |
時刻は、アプリの変更、設定ファイル、PDF の作成日時から取りました。
前回の経験を最初から使う
今回の最初の設定は、指定した仕様どおりに一度で出ました。AI が、前回までのつまずきを最初から避けて書いたためです(7 章の作り直しでは、新しいつまずきが出ました)。
| 前回までのつまずき | 今回の書き方 |
|---|---|
| ページの番号を 0 から数えると、1 ページ目が空になった | ページ・行・写真の番号を 1 から数えた |
| 150dpi で mm の寸法が縮んだ | 96dpi で、寸法は px で書いた |
| 背景のある箱に inline-block を使うと、PDF で文字が消えた | inline-block を使わなかった |
同じ会話の中で続けて頼むと、こうした経験がそのまま次の帳票に生きます。
気を付ける点
- 写真は試し出力ではダミー: 拡張機能の試し出力では写真が仮の画像になります。写真の見た目は印刷屋の PDF で確かめます
- 写真は点検項目の行の順: 7 章の版では、写真は点検項目の行の順に並びます。1 行に添付できる写真は 20 枚までです
- 写真が 0 枚のレコード: 7 章の版で写真のないレコードは、試し出力で 1 ページ(写真のページなし)になることを確かめました。印刷屋の PDF では確かめていません
-
未選択のドロップダウン: 今回の試し出力では
nullとして扱われ、計算式が止まりました。ドロップダウンの値を比べるときは、ESC_HTML()などで空文字列にしてから使います - 背景のあるバッジは折り返さない: 行の途中で折り返すと、PDF で文字が隠れます
- 縦長の写真: 写真の枠は 4:3 の横長に固定しているので、縦長の写真は縦に縮んで見えます。縦長の写真を使う現場なら、枠の形を変えるように頼みます
- 点検項目は 1 ページ目に収まる数まで: 今の行の高さでは、およそ 20 行までです。多いときは、表を複数ページに分けるように頼みます
- 同じ内容の点検項目の行: 最初の版は、機器・項目・測定値の組み合わせを辞書のキーにしたので、3 つとも同じ行は 1 つにまとまりました。7 章の版では行番号をキーにしたので、まとまりません
- 再発行で PDF が増える: ボタンを押すたびに「報告書」に PDF が追加されます。最新の 1 つだけ残したい、確定した報告書は作り直させたくない、といった運用なら、古い PDF を消す更新や、発行後にボタンを出さない条件を頼みます
- 点検会社の名前と住所は仮の値です
まとめ
- テスト用の現場写真も AI に描かせられる。工事黒板を写し込むと、何の写真かが一目で分かる
- 添付ファイルの写真は
IMGSRCで並べ、ROUNDUP(枚数 / 6, 0)でページを増やし、ファイル名から説明を作った - PDF をレコードに保存し、更新項目で「発行日時」を入れた。前回までのつまずきを避けて書いたので、最初の設定は指定した仕様どおりに一度で通った
- 運用の目で見直し、点検項目の行に写真を添付する形に作り直した。説明の入力が要らなくなり、表と写真を番号で照らし合わせられる
シリーズ「rex0220 印刷屋プラグイン - AI(Claude Desktop)に〜」:
- チャットで帳票を作らせる
- 帳票のデザインを作り込ませる
- 見積書から注文書・請求書を作らせる
- 組織図を設計させてから、アプリを作らせる
- QRコード付きの資産ラベルを作らせる
- 写真付きの点検報告書を作らせる(この記事)
関連リンク:








