Download Bulk Write Result

Purpose

To download the result of the bulk write job as a CSV file.

Download URL

Use the URL present in the download_url parameter in the response of Get Bulk Write Job Details.
The file will be in the .zip format. Extract it to get the CSV file. The filename would be in the modulename-filename format. Example: Deals-bulkwrite.
The CSV file will contain the first three mapped columns from the uploaded file, and three more columns — ID, Status, and Errors.

  • STATUS

    This column indicates if the record is added, skipped, updated, or unprocessed.

  • RECORD_ID

    This column indicates the added or updated record's ID in Zoho Vertical Solutions.

  • ERRORS

    This column contains the error code. The format is:

    • <errorCode>-<column_header> for a single error. Example: MANDATORY_NOT_FOUND-Company

    • <errorCode>-<column_header>:<errorCode>-<column_header> for multiple errors. Example: MANDATORY_NOT_FOUND-Company,Last_Name:DUPLICATE_DATA-Email

The possible errors are MANDATORY_NOT_FOUND, INVALID_DATA, DUPLICATE_DATA, NOT_APPROVED, BLOCKED_RECORD, CANNOT_PROCESS, LIMIT_EXCEEDED, and RESOURCE_NOT_FOUND.

Sample Result

sample result

Sample Request

1.0.0ES6
Copied//Get instance of BulkWriteOperations Class
let bulkWriteOperations = new ZCRM.BulkWrite.Operations();
//Call downloadBulkWriteResult method that takes downloadUrl as parameter
let response = await bulkWriteOperations.downloadBulkWriteResult(downloadUrl);
Copiedvar listener = 0;
class DownloadBulkWriteResult {

	async downloadBulkWriteResult()	{
		var url = "https://download-accl.zoho.com/v2/crm/123456778/bulk-write/34770619080471/3477069080471.zip"
        var parameters = new Map()
        var headers = new Map()
        var token = {
            clientId:"1000.NPY9M1V0XXXXXXXXXXXXXXXXXXXF7H",
            redirectUrl:"http://127.0.0.1:5500/redirect.html",
            scope:"ZohoCRM.users.ALL,ZohoCRM.bulk.read,ZohoCRM.modules.ALL,ZohoCRM.settings.ALL,Aaaserver.profile.Read,ZohoCRM.org.ALL,profile.userphoto.READ,ZohoFiles.files.ALL,ZohoCRM.bulk.ALL,ZohoCRM.settings.variable_groups.ALL"
        }
        var accesstoken = await new DownloadBulkWriteResult().getToken(token)
        headers.set("Authorization", "Zoho-oauthtoken " + accesstoken)
        var requestMethod = "GET"
        var reqBody = null
        var params = "";
        parameters.forEach(function(value, key) {
            if (parameters.has(key)) {
                if (params) {
                    params = params + key + '=' + value + '&';
                }
                else {
                    params = key + '=' + value + '&';
                }
            }
        });
        var apiHeaders = {};
        if(headers) {
            headers.forEach(function(value, key) {
                apiHeaders[key] = value;
            });
        }
        if (params.length > 0){
            url = url + '?' + params.substring(0, params.length - 1);
        }
        var requestObj = {
            uri : url,
            method : requestMethod,
            headers : apiHeaders,
            body : JSON.stringify(reqBody),
            encoding: "utf8",
            allowGetBody : true,
			throwHttpErrors : false
        };
        var result = await new DownloadBulkWriteResult().makeAPICall(requestObj);
        console.log(result.status)
        console.log(result.response)
        var filename;

        var disposition = result.getResponseHeader('content-disposition');//No I18N

        if (disposition && disposition.indexOf('attachment') !== -1) {

            var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;

            var matches = filenameRegex.exec(disposition);

            if (matches != null && matches[1]) {

                filename = matches[1].replace(/['"]/g, '');

                filename = filename.replace('UTF-8','');
            }
        }
        let readStream = result.response;

        var url = URL.createObjectURL(readStream);

        var ttt = document.createElement('a');

        ttt.href = url;

        ttt.download = filename;

        ttt.click();

    }

    async getToken(token) {

        if(listener == 0) {

            window.addEventListener("storage", function(reponse) {
                if(reponse.key === "access_token" && (reponse.oldValue != reponse.newValue || reponse.oldValue == null)){
                    location.reload();
                }
                if(reponse.key === "access_token"){

                    sessionStorage.removeItem("__auth_process");
                }
            }, false);
            listener = 1;
            if(sessionStorage.getItem("__auth_process")) {
                sessionStorage.removeItem("__auth_process");
            }
        }
        ["granted_for_session", "access_token","expires_in","expires_in_sec","location","api_domain","state","__token_init","__auth_process"].forEach(function (k) {
            var isKeyExists = localStorage.hasOwnProperty(k);
            if(isKeyExists) {
                sessionStorage.setItem(k, localStorage[k]);
            }
            localStorage.removeItem(k);
        });
        var valueInStore = sessionStorage.getItem("access_token");
        var tokenInit = sessionStorage.getItem("__token_init");
        if(tokenInit != null && valueInStore != null && Date.now() >= parseInt(tokenInit) + 59 * 60 * 1000){ // check after 59th minute
            valueInStore = null;
            sessionStorage.removeItem("access_token");
        }

        var auth_process = sessionStorage.getItem("__auth_process");
        if ((valueInStore == null && auth_process == null) || (valueInStore == 'undefined' && (auth_process == null || auth_process == "true"))) {
            var accountsUrl = "https://zylkercorp.zohoplatform.com/oauth/v2/auth"
            var clientId;
            var scope;
            var redirectUrl;
            if(token != null) {
                clientId = token.clientId;
                scope = token.scope;
                redirectUrl = token.redirectUrl;
            }

            var fullGrant = sessionStorage.getItem("full_grant");
            var grantedForSession = sessionStorage.getItem("granted_for_session");
            if(sessionStorage.getItem("__token_init") != null && ((fullGrant != null && "true" == full_grant) || (grantedForSession != null && "true" == grantedForSession))) {
                accountsUrl += '/refresh';
            }
            if (clientId && scope) {
                sessionStorage.setItem("__token_init", Date.now());
                sessionStorage.removeItem("access_token");
                sessionStorage.setItem("__auth_process", "true");
                window.open(accountsUrl + "?" + "scope" + "=" + scope + "&"+ "client_id" +"=" + clientId + "&response_type=token&state=zohocrmclient&redirect_uri=" + redirectUrl);
                ["granted_for_session", "access_token","expires_in","expires_in_sec","location","api_domain","state","__token_init","__auth_process"].forEach(function (k) {
                    var isKeyExists = localStorage.hasOwnProperty(k);
                    if(isKeyExists){
                        sessionStorage.setItem(k, localStorage[k]);
                    }
                    localStorage.removeItem(k);
                });
                valueInStore = sessionStorage.getItem("access_token");
            }
        }
        if(token != null && valueInStore != 'undefined'){
            token.accessToken = valueInStore;
        }
        return token.accessToken;
    }

    async makeAPICall(requestDetails) {
        return new Promise(function (resolve, reject) {
            var body, xhr, i;
            body = requestDetails.body || null;
            xhr = new XMLHttpRequest();
            xhr.withCredentials = true;
            xhr.open(requestDetails.method, requestDetails.uri, true);
            for (i in requestDetails.headers) {
                xhr.setRequestHeader(i, requestDetails.headers[i]);
            }
            xhr.responseType = "blob";//No I18N
            xhr.send(body);
            xhr.onreadystatechange = function() {
                if(xhr.readyState == 4) {
                    resolve(xhr);
                }
            }
        })
    }
}