スポンサーリンク

【pleasanter/VBA】エクスポート⑥表示名を出したい

プリザンター
スポンサーリンク
※当サイトは広告を含みます

エクセルVBAでプリザンターから情報取得、シリーズ。第6回です。

前回まではVBAでエクスポートする基本、絞り込み条件の指定方法、ソートの方法などをやりました。エクスポートしたデータは選択肢で値・表示名を設定している場合、値が出力されていました。表示名を出したいなあと思うときに、どうやら KeyValues というものが使えそうなので、そのあたりを研究してみました。
なお、VBAでのエクスポートのやり方、フィルター条件のやりかた、は割愛しますので、前回までの記事を参照してください。

※おことわり
2023年7月時点の情報です。プリザンターのバージョンは 1.3.20.0 です。Google Chrome でやっています。
javascript,html,cssともに初心者です。調べながら、やってみながら、きっとこうすればいいんだ!という感じで書いていますので、間違っている場合、効率的な書き方ではない可能性が大いにあります。間違ってるよ!とか、こうしたほうがいいよ!ということがありましたら、コメント等で教えていただけると大変ありがたいです。

1.使用するサイトの内容

前回までと同じです。

2.ApiDataType KeyValues

ApiDataType,KeyValuesとはなんぞや?プリザンターの公式サイトを見てみました。

ApiDataTypeの指定方法
このプロパティではAPIの形式を切り替えることが可能です。以下のどちらかを指定します。
“Default”の場合、従来通りの形式でレスポンスが返却されます。
“KeyValues”の場合、返却されるレスポンスの各項目の形式が表示名となります。GridColumnsを指定しない場合は「テーブルの管理」の「一覧」タブで有効化された項目が取得されます。

引用元:https://pleasanter.org/manual/api-view

よくわからんです。しかし、返却されるレスポンスの各項目も形式が表示名になるっぽいです。

3.やってみる ApiDataTypeにKeyValuesを指定

(1)ポイント

レスポンスデータを取得する際に、ApiDataTypeを指定しない場合はでは
.Cells(i, 2).Value = responseData(“ClassHash”)(“ClassA”)
のように指定していましたが、
ApiDataType を KeyValues にする場合、以下のように表示名で指定します。
.Cells(i, 2).Value = responseData(“種別”)
(表示名で指定しない方法もあります。後述3.ApiColumnKeyDisplayType 参照)

また、ApiDataType を KeyValues にする場合、「一覧」で出力したい項目を有効化してない場合、出力されないっぽいです。←取消2023.9.16

2023.9.17追記:view.AlwaysGetColumns.Add(‘カラム名’) と指定すると、有効化していない項目も取得可能になると教えてもらってやってみたのですが、いまのところできず。
https://pleasanter.org/manual/server-script-view-always-get-columns
GritColumnsで指定すれば取得できそうな気がするのしてきて、やってみたらできたので後述します。
https://pleasanter.org/manual/api-view

(2)コード

以下のように、View にて ApiDataType に KeyValues を指定します。

jsonRequest.Add "View", New Dictionary
jsonRequest("View").Add "ApiDataType", "KeyValues"

絞り込み条件の設定方法などはApiDataType を KeyValues にした場合でも、Default場合と変わりません

jsonRequest("View").Add "ColumnFilterHash", New Dictionary
jsonRequest("View")("ColumnFilterHash").Add "ClassA", "[""100""]"

上述したように、出力時には 項目の表示名 で項目を指定します。

.Cells(i, 1).Value = responseData("タイトル")
.Cells(i, 3).Value = responseData("商品名")
.Cells(i, 13).Value = responseData("更新者")

(3)コード全文

Sub pleasanter_export7()
    Const myApikey As String = "abcd12345"     'apikeyはご自身のapikeyを指定してください
       
    Dim jsonRequest     As Dictionary
    Dim parseResponse   As Dictionary
    Dim httpRequest     As Object
    
    Set jsonRequest = New Dictionary
    
    jsonRequest.Add "ApiVersion", "1.1"
    jsonRequest.Add "ApiKey", myApikey
    
    '******* ここからViewを設定 ************
    jsonRequest.Add "View", New Dictionary
    jsonRequest("View").Add "ApiDataType", "KeyValues"
    jsonRequest("View").Add "ColumnFilterHash", New Dictionary
    jsonRequest("View")("ColumnFilterHash").Add "ClassA", "[""100""]"
    '**************** ここまで *******************
    
    Set httpRequest = CreateObject("msxml2.xmlhttp")
    'サイトID(ここでは426)は出力したいサイトIDを指定してください
    httpRequest.Open "POST", "http://localhost/api/items/426/get"
    httpRequest.setRequestHeader "Content-Type", "application/json;charset=utf-8"
    
    httpRequest.send JsonConverter.ConvertToJson(jsonRequest)
    
    Do While httpRequest.readyState < 4
        DoEvents
    Loop

    Set parseResponse = JsonConverter.ParseJson(httpRequest.responseText)
    
    If parseResponse("Response")("Data").Count <= 0 Then
        MsgBox "なし"
        Exit Sub
    End If

    'KeyValuesの場合は項目名は表示名で指定する
    Dim responseData As Variant
    Dim i As Long: i = 2
    For Each responseData In parseResponse("Response")("Data")
        With ActiveSheet
            .Cells(i, 1).Value = responseData("タイトル")
            .Cells(i, 2).Value = responseData("種別")
            .Cells(i, 3).Value = responseData("商品名")
            .Cells(i, 4).Value = responseData("セット区分")
            .Cells(i, 5).Value = responseData("単価")
            .Cells(i, 6).Value = responseData("個数")
            .Cells(i, 7).Value = responseData("出荷日")
            .Cells(i, 8).Value = responseData("備考")
            .Cells(i, 9).Value = responseData("チェックA")
            .Cells(i, 10).Value = responseData("チェックB")
            .Cells(i, 11).Value = responseData("担当者")
            .Cells(i, 12).Value = responseData("更新日時")
            .Cells(i, 13).Value = responseData("更新者")
            .Cells(i, 14).Value = responseData("ID")
        End With
        i = i + 1
    Next

    MsgBox "出力完了"
End Sub

(4)結果

ApiDataType:KeyValues

ApiDataType:Default
なお、ApiDataType:Default とする場合は、ApiDataTypeを省略したときと同様に
responseData(“ClassHash”)(“ClassA”)
のように指定します。

違いを見てみると。。。

○分類項目

その前に分類項目の設定を見ておきましょう。
分類Aは保存する値と表示名を 100(保存する値),食品(画面上の表示名) のように設定しています。
分類Bは選択肢は設定せず、手入力方式としています。
分類Cは選択肢は表示名は設定せず、値のみとしています。

値と表示名を設定している分類AではApiDataTypeがKeyValuesの場合、食品・生活用品などの表示名が出力されています。指定なし(Default)では100,200等の値が出力されています。

選択肢を指定していない手入力方式の分類BはApiDataTypeがKeyValuesでも指定なしでも出力結果は同じでした。

値のみを設定している分類Cは、ApiDataTypeがKeyValuesの場合でも指定なしでも出力結果は同じでした。

○日付

日付Aについてみてみると、

ApiDataTypeがKeyValuesの場合、表示されている通りに「年月日」で出力されています。
(日付Aは「年月日」を設定しています)

ApiDataType指定なしの場合、2023-6-23T00:00:00 のような形式で時刻まで出ています。

○ユーザー

Owner(管理者)は 選択肢に [[Users]] を設定しています。

ApiDataTypeがKeyValuesの場合、ユーザー名で出力されています。

ApiDataType指定なしの場合、ユーザーのIDが出力されています。

これはユーザー名が出るほうがうれしいですね。

「更新者」(Updater)も同じようにApiDataTypeがKeyValuesの場合はユーザー名、ApiDataType指定なしの場合、ユーザーIDが出力されています。

4.ApiColumnKeyDisplayType

次にApiColumnKeyDisplayType について、やってみました。

ApiColumnKeyDisplayType

値の指定方法は下記「ApiColumnKeyDisplayTypeの指定方法」を参照。本プロパティは、ApiDataTypeが”KeyValues”の場合のみ有効になります。
—————————————————————
ApiColumnKeyDisplayTypeの指定方法
このプロパティでは返却されるレスポンスの各項目のKeyの表示形式を指定することが可能です。以下のどちらかを指定します。
“LabelText”の場合、Keyは表示名となります。
“ColumnName”の場合、Keyはカラム名となります。

引用元:https://pleasanter.org/manual/api-view

どうやら ResponseData のキーを表示名にするか、カラム名にするか、を指定できるようです。

(1)ApiColumnKeyDisplayType で LabelText を指定

ApiColumnKeyDisplayType で LabelText を指定した場合、responseData(“タイトル”) のように、表示名でキーを指定します。
※以下のコードは前半、中盤を省略しています。

'**** 省略 *****
'******* ここからViewを設定 ************
 jsonRequest.Add "View", New Dictionary
 jsonRequest("View").Add "ApiDataType", "KeyValues"
 jsonRequest("View").Add "ApiColumnKeyDisplayType", "LabelText"
'**************** ここまで *******************
'**** 省略 *****
Dim responseData As Variant
Dim i As Long: i = 2
For Each responseData In parseResponse("Response")("Data")
    With ActiveSheet
        .Cells(i, 1).Value = responseData("タイトル")
        .Cells(i, 2).Value = responseData("種別")
        .Cells(i, 3).Value = responseData("商品名")
        .Cells(i, 4).Value = responseData("セット区分")
        .Cells(i, 5).Value = responseData("単価")
        .Cells(i, 6).Value = responseData("個数")
        .Cells(i, 7).Value = responseData("出荷日")
        .Cells(i, 8).Value = responseData("備考")
        .Cells(i, 9).Value = responseData("チェックA")
        .Cells(i, 10).Value = responseData("チェックB")
        .Cells(i, 11).Value = responseData("担当者")
        .Cells(i, 12).Value = responseData("更新日時")
        .Cells(i, 13).Value = responseData("更新者")
        .Cells(i, 14).Value = responseData("ID")
    End With
    i = i + 1
Next

(2)ApiColumnKeyDisplayType で ColumnName を指定

ApiColumnKeyDisplayType で ColumnName を指定した場合、responseData(“Title”) のように、カラム名でキーを指定します
なお、デフォルトで ResponseData(“ClassHash”)(“ClassA”) のように指定しますが、ApiColumnKeyDisplayType で ColumnName を指定した場合、(“ClassHash”)等は不要で、ResponseData(“ClassA”) と指定します。
※以下のコードは前半、中盤を省略しています。

'**** 省略 *****
'******* ここからViewを設定 ************
 jsonRequest.Add "View", New Dictionary
 jsonRequest("View").Add "ApiDataType", "KeyValues"
 jsonRequest("View").Add "ApiColumnKeyDisplayType", "ColumnName"
'**************** ここまで *******************
'**** 省略 *****
Dim responseData As Variant
Dim i As Long: i = 2
For Each responseData In parseResponse("Response")("Data")
    With ActiveSheet
        .Cells(i, 1).Value = responseData("Title")
        .Cells(i, 2).Value = responseData("ClassA")
        .Cells(i, 3).Value = responseData("ClassB")
        .Cells(i, 4).Value = responseData("ClassC")
        .Cells(i, 5).Value = responseData("NumA")
        .Cells(i, 6).Value = responseData("NumB")
        .Cells(i, 7).Value = responseData("DateA")
        .Cells(i, 8).Value = responseData("DescriptionA")
        .Cells(i, 9).Value = responseData("CheckA")
        .Cells(i, 10).Value = responseData("CheckB")
        .Cells(i, 11).Value = responseData("Owner")
        .Cells(i, 12).Value = responseData("UpdatedTime")
        .Cells(i, 13).Value = responseData("Updator")
        .Cells(i, 14).Value = responseData("ResultId")
    End With
    i = i + 1
Next

出力結果は LabelText、ColumnName いずれでも同じです。

5.ApiColumnValueDisplayType

次に、ApiColumnValueDisplayType についてやってみました。

ApiColumnValueDisplayType
値の指定方法は下記「ApiColumnValueDisplayTypeの指定方法」を参照。本プロパティは、ApiDataTypeが”KeyValues”の場合のみ有効になります。
——————————————–
ApiColumnValueDisplayTypeの指定方法
このプロパティでは返却されるレスポンスの各項目のValueの表示形式を指定することが可能です。以下のいずれかを指定します。
“DisplayValue”の場合、Valueは表示名となります。
“Value”の場合、Valueは従来通り、値となります。
“Text”の場合、Valueは設定した書式や単位等も含めた値となります。

引用元:https://pleasanter.org/manual/api-view

どうやら、項目毎に出力するデータを値にするか、表示名にするかを指定できるようです。これはステキ!

DisplayValue、Value、Textについてやってみましょう。

ClassA「種別」をValue(値)で、
NumA「単価」、NumB「個数」をText(設定した書式や単なども含めた値)で、
ClassC「セット区分」をDisplayValue(表示名)で
出力してみます。

結果が分かりやすいように、NumA「単価」には通貨の書式、NumB「個数」には単位を設定しました。

(1)コード

Sub pleasanter_export11()
    Const myApikey As String = "12345abcde"
       
    Dim jsonRequest     As Dictionary
    Dim parseResponse   As Dictionary
    Dim httpRequest     As Object
    
    Set jsonRequest = New Dictionary
    
    jsonRequest.Add "ApiVersion", "1.1"
    jsonRequest.Add "ApiKey", myApikey
    
    '******* ここからViewを設定 ************
    
    jsonRequest.Add "View", New Dictionary
    jsonRequest("View").Add "ApiDataType", "KeyValues"
    jsonRequest("View").Add "ApiColumnHash", New Dictionary
    jsonRequest("View")("ApiColumnHash").Add "ClassA", New Dictionary
    jsonRequest("View")("ApiColumnHash")("ClassA").Add "ValueDisplayType", "Value"
    jsonRequest("View")("ApiColumnHash").Add "NumA", New Dictionary
    jsonRequest("View")("ApiColumnHash")("NumA").Add "ValueDisplayType", "Text"
    jsonRequest("View")("ApiColumnHash").Add "NumB", New Dictionary
    jsonRequest("View")("ApiColumnHash")("NumB").Add "ValueDisplayType", "Text"
    jsonRequest("View")("ApiColumnHash").Add "Owner", New Dictionary
    jsonRequest("View")("ApiColumnHash")("Owner").Add "ValueDisplayType", "DisplayValue"
    
    '**************** ここまで *******************
    
    Set httpRequest = CreateObject("msxml2.xmlhttp")
    
    httpRequest.Open "POST", "http://localhost/api/items/426/get"
    httpRequest.setRequestHeader "Content-Type", "application/json;charset=utf-8"
    
    httpRequest.send JsonConverter.ConvertToJson(jsonRequest)
    
    Do While httpRequest.readyState < 4
        DoEvents
    Loop

    Set parseResponse = JsonConverter.ParseJson(httpRequest.responseText)
    
    If parseResponse("Response")("Data").Count <= 0 Then
        MsgBox "なし"
        Exit Sub
    End If
    
    Dim responseData As Variant
    Dim i As Long: i = 2
    For Each responseData In parseResponse("Response")("Data")
        With ActiveSheet
            .Cells(i, 1).Value = responseData("タイトル")
            .Cells(i, 2).Value = responseData("種別")
            .Cells(i, 3).Value = responseData("商品名")
            .Cells(i, 4).Value = responseData("セット区分")
            .Cells(i, 5).Value = responseData("単価")
            .Cells(i, 6).Value = responseData("個数")
            .Cells(i, 7).Value = responseData("出荷日")
            .Cells(i, 8).Value = responseData("備考")
            .Cells(i, 9).Value = responseData("チェックA")
            .Cells(i, 10).Value = responseData("チェックB")
            .Cells(i, 11).Value = responseData("担当者")
            .Cells(i, 12).Value = responseData("更新日時")
            .Cells(i, 13).Value = responseData("更新者")
            .Cells(i, 14).Value = responseData("ID")
        End With
        i = i + 1
    Next

    MsgBox "出力完了"
End Sub

(2)結果

6.一覧で有効化していない項目を取得する方法

2023.9.16追記です。
一覧画面で表示していない項目はKeyValuseでは取得できないと思っていたら、ViewでGritColumnsで指定したらできました!

コード

Sub pleasanter_export77()
    Const myApikey As String = "1234abc"
       
    Dim jsonRequest     As Dictionary
    Dim parseResponse   As Dictionary
    Dim httpRequest     As Object
    
    Set jsonRequest = New Dictionary
    
    jsonRequest.Add "ApiVersion", "1.1"
    jsonRequest.Add "ApiKey", myApikey
    
    '******* ここからViewを設定 ************

    Dim arr As Variant
    arr = Array("Title", "ClassA", "ClassB", "ClassC")
    
    jsonRequest.Add "View", New Dictionary
    jsonRequest("View").Add "ApiDataType", "KeyValues"
    jsonRequest("View").Add "GridColumns", arr

    
    '**************** ここまで *******************
    
    Set httpRequest = CreateObject("msxml2.xmlhttp")
    
    httpRequest.Open "POST", "http://localhost/api/items/426/get"
    httpRequest.setRequestHeader "Content-Type", "application/json;charset=utf-8"
    
    httpRequest.send JsonConverter.ConvertToJson(jsonRequest)
    
    Do While httpRequest.readyState < 4
        DoEvents
    Loop

    Set parseResponse = JsonConverter.ParseJson(httpRequest.responseText)
    
    If parseResponse("Response")("Data").Count <= 0 Then
        MsgBox "なし"
        Exit Sub
    End If
    
    Dim responseData As Variant
    Dim i As Long: i = 2
    For Each responseData In parseResponse("Response")("Data")
        With ActiveSheet
            .Cells(i, 1).Value = responseData("タイトル")
            .Cells(i, 2).Value = responseData("種別")
            .Cells(i, 3).Value = responseData("商品名")
            .Cells(i, 4).Value = responseData("セット区分")
        End With
        i = i + 1
    Next

    MsgBox "出力完了"
End Sub

結果:一覧で表示していなかったclassBの商品も出ました!

配列に出力したい項目をセットして、ViewのGridColumnsの値として配列をセットしています。
arr = Array(“Title”, “ClassA”, “ClassB”, “ClassC”)
jsonRequest(“View”).Add “GridColumns”, arr

7.最後に

今回は、ApiDataType、ApiColumnKeyDisplayType、ApiColumnValueDisplayType についてやってみました。

マニュアルを読んだだけでははてなだったのですが、やってみたら、なるほどーという感じでした。

なお、ApiDataType、ApiColumnKeyDisplayType、ApiColumnValueDisplayType は ApiDataType に KeyValues を設定した場合のみ有効とのことですので、指定し忘れのないように!

8.参考とした記事

開発者向け機能:JSONデータレイアウト:View

プリザンザンターVBAエクスポートシリーズ
【pleasanter/VBA】エクセルからプリザンターのデータを取得する
【pleasanter/VBA】エクセルからプリザンターのデータを取得する②絞り込み条件の指定
【pleasanter/VBA】エクセルからプリザンターのデータを取得する③変数で絞り込み条件を指定する
【pleasanter/VBA】エクスポート④絞り込み条件で〇〇を含むを指定する
【pleasanter/VBA】エクスポート⑤並べ替え
【pleasanter/VBA】エクスポート⑥表示名を出したい(今回)
【pleasanter/VBA】エクスポート⑦データがちょん切れる時の対応 Offset
【pleasanter/VBA】エクスポート⑧出力される日付を文字列ではなく日付時刻型で出したい
【pleasanter/VBA】エクスポート⑨汎用ツールを作ってみた
【pleasanter/VBA】エクスポート⑩汎用ツール増強版

VBAでインポート
【pleasanter/VBA】エクセルからプリザンターへデータを追加、更新する~import~

プリザンターPowerQuery連携シリーズ
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する①
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する②取得条件の指定方法
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する③上限値以上のレコードを連続で取得する
【pleasanter/PowerQuery】プリザンターの情報をパワークエリで取得する④ユーザーテーブルとマージ

コメント

  1. km より:

    はじめまして。
    プリザンターを社内で利用すると決めてから、こちらのサイトをいつも拝見させていただいています。
    参考になる記事ばかりで大変役に立っています。

    まだ始めたばかりで、公式のマニュアルを何度も見直しながら開発を進めているところです。
    ところで、サーバスクリプトでViewのGridColumnsを使ったデータ取得をされたことはございますか?
    ViewのGridColumnsにてリンク先の項目を取得できますが、クライアント側のAPIでは取得できたものの、サーバスクリプトで取得しようとすると、どうやって戻り値からデータを取得すればよいのか分からず苦戦しています。(リンク先ではない自サイトのデータは問題なく取得できます)

    開発者向け機能:JSONデータレイアウト:View
    https://pleasanter.org/manual/api-view

    公式ガイドでは、「「API」や「サーバスクリプト」でレコードを操作する際に」と記載されていますので、サーバスクリプトでもGridColumnsを使用してリンク先項目のデータも取得できると考えていますが、items.Get で取得した戻り値からどうやってリンク先の項目を得られるのかが分かりません。
    例えば、自サイトのデータなら、戻り値results から、results[0].ClassA などと目的の項目の値を得られますが、リンク先の項目の場合は、results[0].??? とキーとして何を指定したらよいのか、ということです。
    そもそもこういう方法で取得するのではないのでしょうか。または、items.Getでは取得できないのでしょうか。
    もしご存じであればご教示いただけると助かります。

    • mwk より:

      本サイトを閲覧いただきありがとうございます。
      サーバスクリプトでitems.Get 、GridColumnsを使用したデータの取得というものはやったことがないことからご質問の内容を理解することができず、有用なご回答をすることができません。申し訳ありません。
      私自身下手の横好きであれこれやってみているだけですので、詳細の正しい情報は公式サイトへお問い合わせいただくのがベストかと思います。
      プリザンター開発会社さんがやっている「プリザンターお悩み解決 プリなま」という企画でプリザンターお悩み解決を募集しているようですのでそちらをご利用いただくのもおすすめです。

タイトルとURLをコピーしました