Salesforceの画面からcsvファイルをアップロードし、カスタムオブジェクトを生成(登録)する方法

How to upload from sfdc page and create custom object.

これも仕事で実装することになったのですが、通常、csvによるデータのロードにはDataloaderを使用しますよね。
これを使うと柔軟なデータロードができるので、我々技術者としては重宝していると思います。

ただ、お客様が通常の運用で利用するには、少し敷居が高いような気がしています。

今回の案件では、お客様がデータの入力を担当しますが、一回に入力するデータの件数が多いことが想定されるため、一括登録できることが望ましくなっています。

Leadであれば「Web to Lead」の機能があったり、管理者であればカスタムオブジェクト用のウィザードを利用することもできるのですが、権限の制限されているprofileのユーザだとそうもいきません。

また、Javaのアプリを作成してAPIでオブジェクト生成という手もありますが、アプリの配布が難しかったり、端末に制限がある場合もあります。

そこで今回は、SFDCの画面から、「ファイルの選択」ボタンでcsvファイルを指定して、「Upload」ボタンで一括登録を行うことを考えました。
Uploadするファイルに不正なレコードが含まれていたら、CustomObjectのcreateを行わないよう、Validation Checkも行うこととします。またどこかで使うこともあるかもしれないので、備忘的な意味も込めて、簡単なサンプルの作成手順を残しておこうと思います。

まずは、今回のサンプル用にカスタムオブジェクトを作成します。それから、csvファイルをアップロードして、サンプルオブジェクトを生成するapexクラスとvisualforceページを作成してみることにしましょう。

カスタムオブジェクトの用意

SampleCustomObjという名前で、サンプルのカスタムオブジェクトを作成します。
項目は、Nameと、ObjNoという名前のテキスト型項目とします。APIでの参照名はそれぞれ、NameとObjNo__cになりますね。

Upload用ApexClassの用意

最初にUploadを行うApexクラスを作成します。今回は「SamleObjUploader」という名前にしましょう。

public with sharing class SamleObjUploader
{
 
    //最大アップロード件数(Maximam Upload record count)
    public Integer MAX_RECORD_NUM = 100;
 
    public String MSG_OVER_MAX_RECORD = 'Over Max upload record count!';
 
    public string nameFile{get;set;}
    public Blob contentFile{get;set;}
 
    public String[] filelines = new String[]{};
    public List datatoupload = new List();
 
    String strSampleObjNo;
    String strSampleObjName;
 
    //エラーの件数。(Error count)
    public Integer errorCnt = 0;
 
    public Pagereference ReadFile()
    {
 
        nameFile=contentFile.toString();
        filelines = nameFile.split('n');
 
        Integer recordCnt = filelines.size();
 
        //最大アップロード件数チェック(Maximam Upload record count check)
        if (recordCnt > MAX_RECORD_NUM) {
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, MSG_OVER_MAX_RECORD));
 
            return null;
        }
 
        try{
 
            for (Integer i=1;i getuploadedDatas()
    {
 
        if (datatoupload!= NULL)
            if (datatoupload.size() > 0)
                return datatoupload;
            else
                return null;
        else
            return null;
 
    }
 
    public boolean checkInputData(String[] inputvalues)
    {
        boolean checkResult = true;
 
        strSampleObjNo = inputvalues[0];
 
        strSampleObjName = inputvalues[1];
 
        //chack something
        if(strSampleObjNo.length()==0)
        {
            ApexPages.Message errormsg = new ApexPages.Message(ApexPages.severity.ERROR,'Error!!');
            ApexPages.addMessage(errormsg);
            errorCnt++;
            checkResult = false;
        }else
        {
            //chack something
        }
 
        return checkResult;
    }
 
}

UploadTemplate用静的リソースの用意
次に、お客様に利用してもらう、サンプルのcsvファイルをSFDCのVisualForcePageから利用できるように、静的リソースとして 登録します。
詳しくは、前回の記事「Salesforceの画面で利用できる、静的リソースを登録する方法」を参考にしてください。
今回は、「SampleTemplate」という名前で登録しました。

Upload用VisualForcePageの用意
次に、一括登録を行うVisualForcePageを用意します。

Tabの用意
ページができましたので、そのページを参照するタブを作成します。
「アプリケーションの設定」⇒「作成」⇒「タブ」から、「Visualforce タブ」を新規作成します。

以上で一括登録用の画面ができました。
作成したタブから画面を参照してみましょう!

下記のような画面が見えていたら成功です。