0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rex0220 印刷屋プラグイン - AI(Claude Desktop)に写真付きの点検報告書を作らせる

0
Last updated at Posted at 2026-10-12

前回の記事 では、QR コード付きの資産ラベルを作りました。今回は、現場の写真を添付ファイルから並べる、空調設備の点検報告書を作ります。

下は、写真を 10 枚添付したレコードから出した報告書です。1 ページ目に点検項目の表、2 ページ目以降に写真を 6 枚ずつ並べ、写真の枚数に応じてページが増えます。作った PDF はレコードの添付ファイルに保存され、「発行日時」も入ります。

最初の版は、写真の説明をファイル名から作りました。その後、現場での運用を考えて、点検項目の行に写真を添付する形に作り直しました(7 章)。

点検報告書.png

今回は、シリーズでまだ扱っていない次の 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 つは、形で分かりにくいドレンパンと分電盤を、圧力計と温度計に替えたことです。

テスト用の写真.png

どの写真にも「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 件目)の画面です。

レコードの画面.png


4. 報告書を組み立てる

写真を添付した後、OK と伝えると、AI はアプリの項目定義とレコード 2 件(形だけ)を取り込み、報告書の設定を作りました。

1 ページ目

1 ページ目は HTML テンプレートで書き、点検の結果の集計(##summary##)と点検項目の表(##items##)だけを計算式で差し込みます。

1ページ目.png

集計は、点検項目の行から結果ごとの件数を数えています。

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 行)の報告書です。

2件目.png


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 枚を添付しています。

点検項目に写真の列.png

写真を 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

1ページ目(写真の列).png

写真の説明は、その行の値から 2 行で作ります。1 行目が写真の番号と「No.4 室内機 IU-2F-1/フィルター清掃(1/2)」、2 行目が結果のバッジと測定値です。

点検写真.png

途中のつまずき

作り直しの途中で、3 つつまずきました。

空のドロップダウンで計算式が止まった: 全景の行のように「結果」を空にすると、試し出力で計算式がエラーになりました。試し出力は、レコードの値が入りうるのでエラーの文を返しません。AI は式を小さく切った診断用の設定を作って順に試し出力し、原因を絞り込みました。値を直接見られないところは、値の数だけページを足し、ページ数で値を確かめました。今回の試し出力では、未選択のドロップダウンが "" ではなく null として扱われ、計算式の評価に失敗していました。ESC_HTML(結果) で空文字列に変換すると、正しく動きました。

前の設定のまま PDF を作っていた: 1 回目の PDF は、印刷屋に前の設定が入ったまま作っていました。AI は、1 ページ目の表に「写真」列が無いことと、説明がファイル名のままであることから気付きました。

バッジが折り返すと文字が隠れた: 説明が長いと、「要注意」のバッジが行の途中で折り返し、PDF ではバッジの背景が行全体に塗られて、写真の番号と説明が隠れました。説明を 2 行に分け、どちらの行も折り返さないようにして直しました。

説明の崩れ.png

かかった時間

区切り 時刻 かかった時間
写真記録テーブル → 点検項目に写真の列、設定の作り直し 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)に〜」:

  1. チャットで帳票を作らせる
  2. 帳票のデザインを作り込ませる
  3. 見積書から注文書・請求書を作らせる
  4. 組織図を設計させてから、アプリを作らせる
  5. QRコード付きの資産ラベルを作らせる
  6. 写真付きの点検報告書を作らせる(この記事)

関連リンク:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?