kintoneの帳票印刷がk-ReportのAPIで変わるかもしれん

要らなくなった2段ベッドでエアコンの室外機カバーをDIYしたらシンデレラフィットして気持ちが良かったです。な大門@札幌です。

kintone拡張系帳票出力部門の新星「k-Report」。
みなさんご存知ですかね。まだですかね。

k-Report

Adobeリスペクトとのことで出力レイアウトの自由度は超高いですし、工夫次第でkintoneからいろんなアウトプットを捻り出せそうな、かなり楽しげなサービスですよね。

「kintoneの帳票出力サービス」だと思って触ってみると、他とはちょっと毛色が違って抵抗があるという方もいるかもしれません。それよりは「kintoneデータのグラフィカルデザインツール」みたいな捉え方をするとしっくりくるかな、と思います。

他との比較や機能の詳細なんかは、そういう紹介が上手な方に譲るとして、僕が注目したのは、

k-ReportにはAPIがある

ってことですわ。APIで帳票出せるんですぜダンナ。
https://www.k-report.work/

「k-Report」はサイボウズ社が提供しているWebDBサービスの「kintone」に高機能、ハイパフォーマンスな帳票機能を追加、連携するサービスです。

に対してここ見て、ここ。
https://www.k-report.work/pkg/

非エンジニアが帳票設計し、エンジニアはデータのJSONをPOSTするだけ。
“k-Report”は帳票開発の圧倒的な効率を実現出来る「PDF帳票開発のクラウドパッケージ」です

ってことですよ。圧倒的二面性。

APIとは。については端折ります。
ざっくりと、「プログラムを使ってやりとりするための窓口」です。
窓口が無いと、連絡ができない。あるからできる。

どゆことって、そらー、カスタマイズきっかけのトリガーで帳票出せたら実質”制約ゼロ”みたいなもんですわ。なんでもできそう。

だからどゆこと?

基本的に、kintoneのデータを(連携サービスを利用して)帳票化するには、以下の手順が必要です。

  1. 1. kintoneにログインする
  2. 2. レコード(データ)にアクセスする
  3. 3. 帳票化処理を実行する
  4. 4. 実行結果(ファイル)を取得(ダウンロード)する

「3」の「帳票化処理」というのが、帳票サービスが担う機能ですね。

1も2もkintoneにAPIがあります。
4もkintoneのレコードに添付されたファイルならAPIで対応できる機能です。
3にAPIがあれば、全部プログラムでできる。無いと、できない。

「kintoneの帳票サービス」は基本的に、kintoneのデータを「kintoneで」出力するための機能なので、kintone上に「帳票を出力するボタン」があって、これをクリックする。が基本。

なので、kintoneで一回ボタン押さないと帳票ファイル自体が存在しない。

k-Reportも同様です。

でも、APIがある。

だから、他の選択肢が出てきます。

というお話し。
ここが、「帳票サービスにAPIがある!」ってことに注目したポイントです。

やってみた

せっかくのAPIなんで、kintoneアカウントが無いユーザーに帳票を出力させるようなケースでちょっとやってみますね。
「LINEで見積書がダウンロードできますサービス」って感じで行ってみます。

手順はこんな感じ。

  1. 1. k-Reportを設定したkintoneアプリを用意する
  2. 2. LINE Messaging APIのチャネルを用意する
  3. 3. AWSにlambdaでbotを作る
    • botにkintoneレコード登録処理を仕込む
    • botにk-ReportのPDF-URL取得処理を仕込む
  4. 4. Messaging APIにwebhookを設定

で、

  1. 1. お友達になる
  2. 2. botに見積書をお願いする
  3. 3. k-Reportが見積書のURLをくれる
  4. 4. 見積書ダウンロード!

って感じ。よくあるやつにk-Reportを仕込む感じですね。

AWS Lambdaの処理は

「見積書をください」って言われたら何の見積書か確認して、確認した内容のレコードを作って見積書ダウンロードURLを発行して、メッセージで返す

というやつを作りました。

確認した内容のレコードを作って見積書ダウンロードURLを発行

ってところが、k-Reportの出番。

こんな感じです。
(APIの利用サンプルはk-Reportの管理画面からダウンロードできます。下のコードは、コード、コメント等一部流用させていただいています)

const axios = require('axios');
const { KintoneRestAPIClient } = require('@kintone/rest-api-client');
const client = new KintoneRestAPIClient({
  baseUrl: `https://${process.env.KINTONE_DOMAIN}`,
  auth: {
    apiToken: process.env.KINTONE_API_TOKEN
  }
});
class KreportSample {
  async printMitsumori(
    clientName: string,
    title: string,
    productId: string,
    quantity: string
  ) {
    // 見積レコードを作成する
    const res = await client.record.addRecord({
      app: process.env.KINTONE_APP_ID,
      record: {
        顧客名: {
          value: clientName
        },
        見積タイトル: {
          value: title
        },
        テーブル: {
          value: [
            {
              id: null,
              value: {
                商品コード: {
                  value: productId
                },
                数量: {
                  value: quantity
                },
                単位: {
                  value: '式'
                }
              }
            }
          ]
        }
      }
    });

    // (必須)API用の Connection TOKEN(k-Reportの環境毎のトークン)
    const connection_token = process.env.KREPORT_CONNECTION_TOKEN;

    // (必須)指定帳票の Report TOKEN(k-Reportの帳票毎のトークン)
    const report_token = process.env.KREPORT_REPORT_TOKEN;

    // (必須)ターゲットとなる帳票でのクエリ(kintoneのレコード取得queryでいいみたい。)
    const query = `$id = ${res.id}`; 

    // (必須)PDF出力履歴に残すユーザー名
    const user_name = clientName;

    // 保存先ターゲットとなる添付ファイルフィールド。不要な場合は空を設定してください。
    const atcode = process.env.KINTONE_FILE_FIELD_CODE;

    // バッチ用データ取得API
    const base_url = 'https://www.k-report.work/xxxxxxxxxxxxx';

    // APIを実行して、PDF-URLの一覧を取得する
    // (今回は1件だけ)
    const send_url =
      base_url +
      '?t=' +
      report_token +
      '&user=' +
      encodeURIComponent(user_name) +
      '&query=' +
      encodeURIComponent(query) +
      '&atcode=' +
      encodeURIComponent(atcode) +
      '&bt=' +
      connection_token;

    // GETリクエストを送信!
    return await axios
      .get(send_url)
      .then(async (response: any) => {
        console.log({ response });
        if (response['statusText'] == 'OK') {
          // 'trigger' が PDF-URL
          return response['data']['records'][0]['trigger'];
        } else {
          console.log(response);
        }
      })
      .catch(function (response: any) {
        // 失敗時
        console.log('error', response);
      });
  }
};
module.exports = KreportSample;

できた

所感

用意されているAPIのエンドポイントURLに、トークンなど適切なパラメータを渡してあげることで、k-Reportで設定した指定の帳票の一覧が取得できます。

取得条件は対象のkintoneアプリの取得クエリなので、帳票設定の対象アプリのレコードを、PDFを出力するための”trigger”というパラメータ付きで取得できますよ。というイメージ。
ただし、JSONのかたちはkey:valueになっていて、kintoneとは違います。

こんな感じ。

{
  id: '1',
  trigger: 'https://www.k-report.work/xxxxxxxxx?dum=1&t=xxxxxxxx&id=xxxxxxxx&user=xxxx&atcode=xxxx&rect=xxxx',
  record: {
    '$revision': '5',
    '$id': '3',
    '担当:担当': '大門 純平',
    'レコード番号:レコード番号': '3',
    '顧客番号:顧客番号': '',
    '見積書:見積書': '',
    '更新者:更新者': 'Administrator',
    '作成者:作成者': '大門 純平',
    '合計:合計': '0',
    '総合計:総合計': '0',
    '更新日時:更新日時': '2023-07-29T02:31:00Z',
    '見積日:見積日': '2023-07-19',
    '見積番号:見積番号': 'SUP-0723-003',
    '見積書の添付:見積書の添付': '添付する(単票)',
    '顧客名:顧客名': '',
    '税率:税率': '10',
    '消費税:消費税': '0',
    '作成日時:作成日時': '2023-07-19T14:42:00Z',
    '見積タイトル:見積タイトル': '',
    '見積書備考:見積書備考': '必要な場合は別途お見積りします。'
  }
}

“trigger”が「PDFを発行するAPIのエンドポイントURL」です。
アクセスすると、当該レコードの最新状態が反映されたPDFをダウンロードできます。これを「PDF-URL」と呼称しているみたいですね。

PDF-URLはダウンロードURLじゃないんだからね

上の動画、最後に帳票をダウンロードするURLがメッセージされていますが、URLを隠してあります。

k-Reportが発行する「PDF-URL」を、そのままメッセージに表記していたのですが、これは運用的にはNGかな、と思います。(じゃあ直せ)

このURLにアクセスするたびに、”帳票を1回出力しましたよ”、としてカウントされます。基本契約で毎月20,000枚の出力上限数があって、アクセス自体がこれに影響します。

アクセスすれば最新のPDFがダウンロードできる便利なURLではありますが、何も考えずに公開して良いタイプのURLではありません。

運用次第のところもありますが、あくまでプログラムで制御して使用するためのAPIのエンドポイントなので、利用シーンはよく考えましょう。

権限にはご注意を

k-Reportがkintoneにアクセスする際の認証はAPIトークン認証です。

k-Reportに限ったことではないですが、APIトークン認証の場合、対象アプリの権限設定には注意が必要です。
フィールド別の権限制御が役に立たないので、外部からアクセスするアプリは通常運用とは別個に用意するなど、セキュリティ対策はご安全に。

逆に、そのあたりが適切に構成されていれば、k-Reportが活躍する場面は広そうです。

もっと他にもk-Report。

APIがある帳票出力機能。

あるとできる。無いとできない。

人間がkintoneに触れずに帳票を生成する

これができることで、「帳票ファイルを事前に作っておく」という考え方から解放されます。アクセスされたときに最新データの出力を配信する手順をAPIがシンプルにしてくれる。この辺りの違いがポイントかな、と思います。

レコードが持っている状態に応じて出力内容を可変にできるので、ステータスや数量に応じた出力が可能です。
予約や決済の仕組みを通すことで、チケットの発行なんかにも使えそうですね。

まだ、ちょっと触ってみただけで、まだまだアイデア湧いてきそうです。思いついたらまた書きたいと思いますー。

   kintoneのアプリ開発はこちら <相談無料>    

同じカテゴリーの記事