コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

045.【ID】作成バージョンを判定

CC13.1.1、CC14.0.2(Windows)で確認。
Array.filter()はES3で使うためのArray.filter - DTPabからお借りしています。

書いたコード

// Production steps of ECMA-262, Edition 5.1, 15.4.4.20
// https://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.20
// from http://javascript.boxsheep.com/polyfills/Array-prototype-filter/
if (!Array.prototype.filter) {
    Array.prototype.filter = function(callbackfn , thisArg) {
        "use strict";
        var O = Object(this),
            lenValue = O.length,
            len = lenValue >>> 0,
            T,
            A,
            k,
            to,
            Pk,
            kPresent,
            kValue,
            selected;
 
        if (typeof callbackfn !== "function") {
            throw new TypeError();
        }
 
        T = thisArg ? thisArg : undefined;
        A = new Array();
        k = 0;
        to = 0;
        
        while(k < len) {
            Pk = k.toString();
            kPresent = O.hasOwnProperty(Pk);
            if (kPresent) {
                kValue = O[Pk];
                selected = callbackfn.call(T, kValue, k, O);
                if (!!selected) {
                    A.push(kValue);
                    to += 1;
                }
            }
            k += 1;
        }
        return A;
    };
}



var definition = [
{  "CCCS": "CS4", "major": "6"},
{  "CCCS": "CS5", "major": "7"},
{  "CCCS": "CS5.5", "major": "7.5"},
{  "CCCS": "CS6", "major": "8"},
{  "CCCS": "CC", "major": "9"},
{  "CCCS": "CC 2014", "major": "10"},
{  "CCCS": "CC 2015", "major": "11"},
{  "CCCS": "CC 2016", "major": "12"},
{  "CCCS": "CC 2018", "major": "13"},
{  "CCCS": "CC 2019", "major": "14"}
]
var log = "";

var appMajorVer = getAppVer();
var docMajorVer = getDocVer(app.activeDocument);
var appCCCSVer = getCCCSVer(appMajorVer);
var docCCCSVer = getCCCSVer(docMajorVer);
var docVerPath = decodeURI(app.filePath).replace(appCCCSVer, docCCCSVer);

if (appMajorVer === docMajorVer) {
  log = "作成バージョンは" + docCCCSVer + "です。現在のバージョンと一致しています";
} else {
  if (new Folder(docVerPath).exists) {
    log = "作成バージョンは" + docCCCSVer + "です。\rこのバージョンはインストールされています。"
  } else {
    log = "作成バージョンは" + docCCCSVer + "です。\rこのバージョンはインストールされていません。"
  }
}

alert(log);


function getAppVer() {
  var fullVer = app.version;
  var majorVer = parseFloat(fullVer).toFixed(1);
  if (majorVer !== 7.5) { // CS5.5
    majorVer = parseInt(majorVer, 10)
  }
  return majorVer;
}

function getDocVer(doc) {
  var docVer = doc.metadataPreferences.creator;
  var majorVer = docVer.replace("Adobe InDesign ", "").replace("CC ", "").replace(/ \(.+$/, ""); // 13.1/CS6
  if (majorVer.indexOf("CS") === 0) {
    majorVer = getMajorVer(majorVer)
  } else {
    majorVer = parseInt(majorVer, 10);
  }
  return majorVer;
}

function getCCCSVer(ver) {
  var tmp = definition.filter(function (ele) {
    return ele.major === ver + "";
  })
  return tmp[0].CCCS;
}

function getMajorVer(ver) {
  var tmp = definition.filter(function (ele) {
    return ele.CCCS === ver + "";
  })
  return tmp[0].major;
}

メモ

最終目標はバージョンを判定後、作成したバージョンで開いて他のスクリプトを実行する
積み残しは大きく分けて以下の2点。
①マイナーバージョンの取得
②旧バージョンで開きなおす

マイナーバージョンの取得

  • マイナーバージョンまで一致
  • メジャーバージョンだけ一致
  • 異なるバージョンで、インストールされている
  • 異なるバージョンで、インストールされてない

上記4パターンの判定を行ってから別のスクリプトの処理に移りたい。
現状メジャーバージョンの比較しかできていない。
そのほか、

  • Documentオブジェクトのマイナーバージョンを取得したい。
  • そもそも開かないでバージョンを取得するやり方はないのか。

旧バージョンで開きなおす

var varsion = "13.1"
var tmp= "//@target 'indesign-"+ varsion +"'\ralert("テスト")"
eval (tmp);

みたいなことがしたい。

  • 旧バージョンのInDesignはexecute()で起動できる。
var flag = new File("C:/Program Files/Adobe/Adobe InDesign CC 2018/InDesign.exe");
flag.execute();
  • パッケージ版CSはアプリケーションのフォルダがCCとは別のところにあるので、「インストールされているかどうか」の判定のところが未対応。

実際に仕事で使う場面ではVBAと連携させるので、今回jsで積み残したところはVBAでやることになると思う。
VBAで最新バージョンのInDesignを起動
VBAから上記InDesignでこのスクリプトを実行
③このスクリプトで作成バージョンを取得し、txtを作成
VBAで③のtxtを読み、該当バージョンのInDesignを起動
⑤④のInDesignで別のスクリプトを実行
というイメージ(③もVBAでやるべきなのでは…)。

その他

  • JSでは後読みが使えない
  • マイナーバージョンチェンジをどう考えるべきなのかという方針の問題
  • OSの違いは判別しない処理になっている

参考