Analytics Cloud External Data APIをPHP/Forrestで試してみた。

どうも、エンジニアの守屋です。

今回はPHP/Forrestを使って「Analytics Cloud」にCSVファイルをアップロードしてみます。

※Forrestとは、PHPでSalesforce/REST APIを便利に扱えるライブラリ。 github.com

今回の記事では認証系は省略します。



【アップロード全体の流れ】

  • InsightsExternalDataにデータ形式情報をセット
  • InsightsExternalDataPartにCSVファイルをアップロード
  • アップロードしたデータの取り込み処理を実行



■ InsightsExternalDataにデータ形式情報をセット

適応させるアプリケーションを指定するためにまず、それらのデータを取得する。

$edgemart_containers = Forrest::query('
    Select
        Id, Name, Type, DeveloperName, IsReadonly
    From
        Folder
    Where
        Type=\'Insights\'
');



取得したアプリケーションから適応させるアプリケーションのSFIDを指定する。

$edgemart_container_id = アプリケーションのSFID

$insight_response = Forrest::sobjects('InsightsExternalData', [
    'method' => 'post',
    'body' => [
        'Format' => 'CSV',
        'Action' => 'None',
        'EdgemartAlias' => アップロードする名前を指定する,
        'Operation' => 'Append', # アップロードの操作、今回は追加。
        'MetadataJson' => "{base64 エンコードした JSON}",
        'EdgemartContainer' => $edgemart_container_id,
    ]
]);



MetadataJsonについて

アップロードするCSVファイルの構造を記述。 指定しなくても送信・登録は可能ですが、 すべてText型で登録されます。

MetadataJsonのドキュメント

$meta_json = base64_encode(json_encode([
    "fileFormat" => [
        "charsetName" => "UTF-8",
        "fieldsDelimitedBy" => ",",
        "fieldsEnclosedBy" => "\"",
        "linesTerminatedBy" => "\n"
    ],
    "objects" => [
        [
            "connector" => "CSV",
            "description" => "",
            "fullyQualifiedName" => '',
            "label" => $upload_name,
            "name" => $upload_name,
            "fields" => [
                [
                    "fullyQualifiedName" => "Column1",
                    "name" => "Column1",
                    "type" => "Date",
                    "label" => "日付",
                    "format" => "yyyy-MM-dd"
                ],
                [
                    "fullyQualifiedName" => "Column2",
                    "name" => "Column2",
                    "type" => "Text",
                    "label" => "名前"
                ],
                [
                    "fullyQualifiedName" => "Column3",
                    "name" => "Column3",
                    "type" => "Numeric",
                    "label" => "スコア",
                    "precision" => 18,
                    "defaultValue" => "0",
                    "scale" => 1,
                    "format" => "0.0",
                    "decimalSeparator" => "."
                ],
            ]
        ]
    ]
]);

※送信時にbase64エンコードをしてあげる必要があります。



■ InsightsExternalDataPartにCSVファイルをアップロード。

セットしたレコードのSFIDを「InsightsExternalDataId」に指定し、 DataFileにbase64_encodeに変換したCSVデータをセットし送信する。

※DataFileに格納できる容量は10MBまでなので、 10MB以上のデータを取り込む場合は複数のInsightsExternalDataPartを作成する必要があります。 その場合、連番としてPartNumberを1から順に増やしていきます。 今回は10MB以下なので1とします。

$external_data_id = $insight_response['id'];
Forrest::sobjects('InsightsExternalDataPart', [
    'method' => 'post',
    'body' => [
        'InsightsExternalDataId' => $external_data_id,
        'DataFile' => $csv,
        'PartNumber' => 1
    ]
]);



■ アップロードしたデータの取り込み処理を実行。

InsightsExternalDataのAction項目を"Process"に更新します。

Forrest::sobjects('InsightsExternalData/' . $external_data_id, [
    'method' => 'patch',
    'body' => [
        'Action' => 'Process'
    ]
]);



以上です。



公式ドキュメント

参考URL medium.com

blog.freedom-man.com