Tech Dynamics 365 (CRM)

Microsoft Dynamics 365 (CRM) を中心とした技術情報を提供しています。

JavaScriptを使用してWordテンプレートをダウンロードする

こんにちは。

今回は、JavaScriptを使用してWordテンプレートをダウンロードする方法をご紹介します。

なお紹介にあたり、以下のサイトのQ&Aを参考にさせていただきました。
stackoverflow.com


WordテンプレートをダウンロードするためのJavaScript

通常、Wordテンプレートを出力する際はコマンドバーから登録されているWordテンプレートをクリックするという手順を踏みますが、以下のfunctionをイベントトリガーやhtmlのボタンから呼び出せば、直接Wordテンプレートのダウンロードが行えます。

function DownloadWordTemplate () {
    // 定数定義(ここの変数に情報をセットしてください)
    var entityTypeCode = 1061;
    var templateId = "a1b2c3d4-e5f6-g7h8-0123-a123b456c789";
    var templateType = 9940;
    var fileName = "テスト.docx";
    var entityId = new Array();
    entityId.push(Xrm.Page.data.entity.getId());

    // Wordテンプレート出力処理
    Xrm.Page.ui.clearFormNotification("docerror");
    var path = Xrm.Page.context.getClientUrl() + "/_grid/print/print_data.aspx";
    var req = new XMLHttpRequest();
    req.open("POST", path, true);
    req.responseType = "arraybuffer";
    req.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
    req.setRequestHeader("Accept-Language", "en-US,en;q=0.8");
    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    req.onreadystatechange = function () {
        if (this.readyState == 4) {
            req.onreadystatechange = null;
            if (this.status >= 200 && this.status <= 299) {
                var mimeType = (2 === 2) ?
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document" :
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                var blob = new Blob([req.response], { type: mimeType });
                var dlodURL = URL.createObjectURL(blob);
                var a = document.createElement("a");
                if (navigator.msSaveOrOpenBlob) {
                    navigator.msSaveOrOpenBlob(blob, fileName);
                } else {
                    document.body.appendChild(a);
                    a.style = "display: none";
                    a.href = dloadurl;
                    a.download = fileName;
                    a.click();
                    URL.revokeObjectURL(dlodURL);
                }
            }
        }
    };
    var formData =
        "exportType=MergeWordTemplate&selectedRecords=" + encodeURIComponent(JSON.stringify(entityid)) +
        "&associatedentitytypecode=" + entityTypeCode +
        "&TemplateId=" + templateId +
        "&templatetype=" + templateType;
    req.send(formData);
}


定数定義の解説

entityTypeCode
エンティティコード(etc)を指定します。
画面を開いている状態であれば、ハードコーディングするより以下のコードで取得した方がよいと思います。

Xrm.Page.context.getQueryStringParameters().etc;

templateId
出力したいWordテンプレートのGUIDを指定します。
GUIDがわからない場合は、documenttemplateのFetchXMLを作成してSOAP通信すればidを取得できます。
もっと簡単に取得したい場合は、F12開発者ツールのDOM Explorerで出力したいWordテンプレートのリンクを指定するとその親の<li>タグ内のidの末尾にGUIDが表示されていますので、そちらで取得できます。
例:id="new_test|NoRelationship|Form|Mscrm.Form.new_test.WordTemplates.Menu.Wordテンプレート.Controls.a1b2c3d4-e5f6-g7h8-0123-a123b456c789"

templateType
出力したいWordテンプレートのタイプを指定します。
ここでは『9940』としておりますが、個人用テンプレートの場合は『9941』を指定します。

fileName
Wordテンプレートを出力するときのファイル名を指定します。