とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

Pleasanterでスクリプトからリンクした項目に値を設定して「? xxxx」が表示される場合の対処法

ローコード・ノーコード開発ツール「Pleasanter(プリザンター)」は、業務アプリケーションをスピーディに構築できる便利なプラットフォームです。特に、データ同士を関連付ける「リンク機能」は、複雑な業務プロセスの中でデータの整合性を保つうえで非常に重宝します。

しかし、実際に使い始めてみると、画面操作ではうまくいっていたのに、スクリプトやインポート時にうまく動かないという事象に直面することがあります。この記事では、Pleasanterを使い始めた方がつまずきがちなリンク機能の落とし穴と、その解決方法を紹介します。

起きていること

リンク機能をインポート処理で活用する場合、リンクしたい値(たとえば、メールアドレスのドメイン)を事前に設定しておけば、Pleasanterが自動的にリンク先とマッピングしてくれます。

しかし、スクリプト(サーバースクリプトも含む)を使って抽出した値をそのままリンク項目に設定し、インポートしてみると、「? xxxx」のように表示され、うまくマッピングされないことがあります。

なぜ起きてるのか

まず、初歩的な原因として考えられるのは、そもそもマスタとして該当の値を登録していな いか、値の前後に空白文字か画面に表示されない特殊文字などが含まれていて、完全一致しないケースです。

それでも解決しない場合、問題の切り分けとして手動操作とスクリプト実行を試してみます。操作した結果、画面上から手作業で入力して登録されたが、スクリプトを使った処理では上手くいかない場合が今回のお話です。

この現象が起きる理由は、普段はブラックボックスになっており、あまり意識ないところかと思いますが、画面上では「ラベル名」や「表示名」が表示されています。見た目はテキストで紐づけられているように見えますが、Webアプリケーションのリストダウンを使用した際の標準的な仕組みです。

リストダウンで選択した値はデータ上では「ID」で管理されており、内部的には与えられた数字(サイトID)を使って関連付けを行っています。そのため、スクリプトで文字列として抽出した値を直接設定しても、Pleasanter側でIDとして認識されず、マッピングができなくなってしまうのです。

対処法

この問題を解決するには、先ほど触れたようにIDを指定するだけで解決します。IDを指定するだけと言ったものの、そこまで簡単な話でもなく、スクリプトで検索して取得してから設定する必要があります。

具体的な方法として、Pleasanterにはitems.Getという便利な関数が用意されており、指定した条件に合致するレコードを取得できます。以下はその一例です。

const results = items.Get(
  domainTableSiteId,
  JSON.stringify({
    View: {
      ColumnFilterHash: {
        Title: mailDomain,
      },
    },
  })
);

// 結果から最初のアイテムを取得する
let targetData = null;
for (const result of results) {
  targetData = result;
  break;
}

if (targetData) {
  model.ClassA = targetData.ResultId;
}

このコードでは、抽出したドメイン名(mailDomain)を条件にリンク先のテーブル(domainTableSiteId)から該当するレコードを取得し、そのID(ResultId(または、IssueId))をリンク項目(ClassA)に設定しています。