前回、前々回とパワークエリでプリザンターの情報を取得する、をやりました。
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する①
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する②取得条件の指定方法
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する③上限値以上のレコードを連続で取得する
今回はプリザンターからテーブルを取得すると同時に、ユーザー情報も取得して、ユーザーIDではなくユーザー名を表示する、というのをやってみたいと思います。
※ユーザーテーブルと組織テーブルにアクセス権がない等、取得できない可能性もあります。
※おことわり
2024年3月時点の情報です。プリザンターのバージョンは 1.3.50.2 です。Google Chrome でやっています。
javascript,html,cssともに初心者です。調べながら、やってみながら、きっとこうすればいいんだ!という感じで書いていますので、間違っている場合、効率的な書き方ではない可能性が大いにあります。間違ってるよ!とか、こうしたほうがいいよ!ということがありましたら、コメント等で教えていただけると大変ありがたいです。
1.使用するテーブル
サイトID151
ユーザーテーブル
2.パワークエリでサイトの情報を取得し、ユーザーテーブルをマージしてユーザー名を表示する
(1)サイトの情報をパワークエリで取得する
まず、サイトの情報をパワークエリで取得します。
コード
ID151のサイトから情報を取得し、テーブルとして展開し、ID、タイトル、担当者を表示しています。
IDの昇順で取得しています。特に意味はありません。
※サーバー名、サイトID、apiキーは実際のものに書き換えてください
let
url = "http://localhost/api/items/151/get",
api = "abc12345",
requestJson = Json.FromValue([
ApiKey = api,
View = [
ColumnSorterHash = [ResultId = "asc"]
]
]),
res = Web.Contents(url,[
Headers = [#"Content-Type" = "application/json"],
Content = requestJson
]),
res_json = Json.Document(res),
Response = res_json[Response],
Data = Response[Data],
テーブルに変換済み = Table.FromList(Data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"展開された Column1" = Table.ExpandRecordColumn(テーブルに変換済み, "Column1", {"ResultId", "Title", "Owner"}, {"ResultId", "Title", "Owner"})
in
#"展開された Column1"
「閉じて読み込む」として、ワークシートに出力したところです。担当者は取得していますが、IDの表示のためだれやらわかりません。
(2)ユーザーテーブルを取得する
空のクエリなどで(1)のテーブル情報取得とは別のクエリを立ち上げてください。
コード(※サーバー名、apiキーは実際のものに書き換えてください)
サイトの情報を取得するときとほとんど同じです。urlを items/サイトID から users に変えています。
let
url = "http://localhost/api/users/get",
api = "abc12345",
requestJson = Json.FromValue([ApiKey = api]),
res = Web.Contents(url,[
Headers = [#"Content-Type" = "application/json"],
Content = requestJson
]),
res_json = Json.Document(res),
Response = res_json[Response],
Data = Response[Data],
テーブルに変換済み = Table.FromList(Data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"展開された Column1" = Table.ExpandRecordColumn(テーブルに変換済み, "Column1", {"UserId", "Name", "UserCode", "DeptCode", "DeptId"}, {"UserId", "Name", "UserCode", "DeptCode", "DeptId"})
in
#"展開された Column1"
情報を取得し、ユーザーID、名前、ユーザーコード、組織コード、組織IDを展開しました。
ワークシートには出力せず、接続専用とします。
クエリを右クリックして「名前の変更」でクエリ名を「userTB」としました
(3)二つのテーブルをマージする
①クエリ1を選択し、リボン「ホーム」>「クエリのマージ」>「クエリのマージ」をクリックします
②くっつけるテーブルに「userTB」を指定します。
結合するキー項目は、クエリ1は「Owner」をクリックして指定。
userTB側は「UserId」をクリックして指定。
結合の種類は初期値の「左外部」のままにします。
③userTBが結合されました。
「展開」ボタンをクリックして「Name」を表示します。
④名前が表示されました。
⑤Ownerの列を削除します。
⑥「閉じて読み込む」をクリックし、ワークシートに出力します。コードの代わりに名前が表示されました。
本筋とは関係ないのですが、せっかくResultId順に読み込んだのに、マージ後並び順が変わってしまいました。パワークエリってマージすると順番変わっちゃうんですかね。
ご参考まで、詳細エディタのコードは以下のようになりました。
let
url = "http://localhost/api/items/151/get",
api = ""abc12345",
requestJson = Json.FromValue([
ApiKey = api,
View = [
ColumnSorterHash = [ResultId = "asc"]
]
]),
res = Web.Contents(url,[
Headers = [#"Content-Type" = "application/json"],
Content = requestJson
]),
res_json = Json.Document(res),
Response = res_json[Response],
Data = Response[Data],
テーブルに変換済み = Table.FromList(Data, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"展開された Column1" = Table.ExpandRecordColumn(テーブルに変換済み, "Column1", {"ResultId", "Title", "Owner"}, {"ResultId", "Title", "Owner"}),
マージされたクエリ数 = Table.NestedJoin(#"展開された Column1", {"Owner"}, userTB, {"UserId"}, "userTB", JoinKind.LeftOuter),
#"展開された userTB" = Table.ExpandTableColumn(マージされたクエリ数, "userTB", {"Name"}, {"Name"}),
削除された列 = Table.RemoveColumns(#"展開された userTB",{"Owner"})
in
削除された列
3.ユーザーテーブルを取得するときに、絞り込み条件を指定する場合の書き方
(1)でユーザーテーブルを取得していますが、全部は要らない、総務部(組織ID2)、と経理部(組織ID5)だけでいいんだけど、という場合は以下の指定になります。
let
url = "http://localhost/api/users/get",
api = "abc12345",
requestJson = Json.FromValue([
ApiKey = api,
View = [
ColumnFilterHash = [DeptId = "[2,5]"]
]
]),
res = Web.Contents(url,[
Headers = [#"Content-Type" = "application/json"],
Content = requestJson
]),
//以下略
5.ユーザー情報を取得する関数を作ってみた。
(1)作成するもの
社員番号(userテーブル内でuserCodeに社員番号が充当されている想定)を入力すると、該当のユーザーの情報が表示される関数、社員名の一部を入力すると該当のユーザーの情報が表示される関数をパワークエリで作ってみたいと思います。
(2)準備
userテーブルとdeptテーブルの情報を取得するクエリを作成し、双方をマージして情報元DBとなるテーブルを作成しておきます。
①前項でやりましたが、userテーブルから情報を取得して、展開しておきます。読み込みは「接続専用」で大丈夫です。クエリの名前は「userTB」とします。
②deptテーブルからuserテーブルと同様に情報を取得して展開しておきます。読み込みは「接続専用」で大丈夫です。
userテーブルの取得方法とだいたい同じでurlの部分を users から depts に変更するくらいです。
url = “http://localhost/api/depts/get”
クエリの名前は「deptTB」とします。
③ ①のuserテーブルに②のdeptテーブルを組織IDでマージします。
①userTBをもとにして、「新規のクエリとしてマージ」としてdeptTBを結合しましたが、普通にマージでも大丈夫です。
クエリの名前は「マージuserTBdeptTB」とします。
(3)社員番号(ユーザーコード)からユーザー情報を取得する関数
空のクエリを作成し、以下のコードを入力します。
クエリ名は「fn社員番号からユーザー情報を取得」とします。
(社員番号 as text) =>
let
ソース = マージuserTBdeptTB,
フィルターされた行 = Table.SelectRows(ソース, each ([UserCode] = 社員番号))
in
フィルターされた行
「完了」をクリックすると以下のような画面が出ます。
関数を実行してみましょう。社員番号「p013」を入力し、「呼び出し」をクリックします。
社員番号p013の木村美恵さんが呼び出しされました。
木村さんのプリザンター内でのUserIdが14であることや、部署が営業部であることがわかりました。
(4)社員名(の一部)からユーザー情報を取得する関数
空のクエリを作成し、以下のコードを入力し、完了ボタンをクリックします。
クエリ名は「fnユーザー名からユーザー情報を取得」とします。
(社員名の一部を入力 as text) =>
let
ソース = マージuserTBdeptTB,
フィルターされた行 = Table.SelectRows(ソース, each Text.Contains([Name], 社員名の一部を入力))
in
フィルターされた行
関数を実行してみましょう。
「鈴木」と入力して「呼び出し」をクリックします。
鈴木太郎さんと鈴木花子さんが表示されました。
(5)どうやって作ったか
素人の私にも作れた!作り方を大公開。
①まず、マージしたテーブルで、適当な社員番号でフィルターをかける。
②「詳細エディター」をクリックしてコードを表示。フィルターした部分のコードをコピーする。
③コードをコピーしたら、フィルターしたステップは削除します。
④空のクエリを作成します。
⑤「詳細エディター」をクリックして開いて、ソースの=の右辺にマージuserTBdeptTBと基にするデータのクエリ名を入力します。最後のカンマも忘れずに
⑥ ②でコピーしておいたフィルターのコードを改行して張り付けします。
2か所、書き換えます。
⑦一番上の行に引数を受け取る部分を入力します。この部分があるとパラメーター入力の画面になるんですね。
(引数名) =>
と入力します。引数名は何でもOK。as text は引数はテキスト型に限定しますよ!という意味を持ちますが、あってもなくてもいいです。
⑧フィルターの “p002” 部分を引数名に置き換えます。
これで完了をクリックすると出来上がりです。
6.最後に
今回は、パワークエリでプリザンターのユーザー情報を取得しておいて、テーブルから取得した情報のユーザーコードが表示される部分に氏名などを表示できるようにする、というのをやりました。
ユーザーがめっちゃいるんだけど。。。という環境では試していないので、そのような場合どうなるかはわかりません。。。
ユーザー情報を取得する関数なんかも作ってみたりしましたが、それも実際使う場面があるのか。。。パワークエリ勉強中なので、やってみたかった、というのがほんとのところです。
お読みいただきありがとうございました。
7.参考文献、記事
プリザンター公式より
参考とさせていただいた記事。ありがとうございました。
VBAは嫌なのでPleasanter APIからPower QueryでExcelに割振りたいと思います。(+Power BI連携も)
[Power Query] for ループのような処理を Power Query で行う方法
[Power BI] Power Query の Web.Contents 関数でREST APIを使う(仮)
内部リンク
プリザンターPowerQuery連携シリーズ
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する①
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する②取得条件の指定方法
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する③上限値以上のレコードを連続で取得する
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する④ユーザーテーブルとマージ
プリザンザンターVBAエクスポートシリーズ
【pleasanter/VBA】エクセルからプリザンターのデータを取得する
【pleasanter/VBA】エクセルからプリザンターのデータを取得する②絞り込み条件の指定
【pleasanter/VBA】エクセルからプリザンターのデータを取得する③変数で絞り込み条件を指定する
【pleasanter/VBA】エクスポート④絞り込み条件で〇〇を含むを指定する
【pleasanter/VBA】エクスポート⑤並べ替え
【pleasanter/VBA】エクスポート⑥表示名を出したい
【pleasanter/VBA】エクスポート⑦データがちょん切れる時の対応 Offset
【pleasanter/VBA】エクスポート⑧出力される日付を文字列ではなく日付時刻型で出したい
【pleasanter/VBA】エクスポート⑨汎用ツールを作ってみた
【pleasanter/VBA】エクスポート⑩汎用ツール完全版
コメント