コモノExtendScript100本ノック

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

002.【ID】任意のidのオブジェクトを探す

書いたコード

※未完成

var objs=app.activeDocument.stories.itemByID(107685); // ここでid指定
if (objs.hasOwnProperty("select")){
    objs.select();
    }else{
switch (objs.constructor.name) {
    case "Story":
    var tfLen = objs.textContainers.length;
    for(var i=0;i<tfLen;i++){
    objs.textContainers[i].select(SelectionOptions.ADD_TO);
    }
    break;
    default:
    alert("わからん");
    }
}

メモ

方針

フローチャートを作る段階でお題を変更した。
「選択オブジェクトがコレクション中の何番目か取得」

「任意のidのオブジェクトを探す」
あるオブジェクトがどこのページ/マスタースプレッドにあるか見るようにした。
他人が書いたスクリプトを読むとき/流用するとき、どのオブジェクトを処理対象としているのか、どのオブジェクトで躓いているのかすぐ分かるようにしたかった。

反省点

  • 当初のお題があいまいだった。
  • 単純に知識不足を痛感した。再帰処理をうまく使えれば選択するんじゃなくてページやスプレッドを特定することができたのかも…。
  • フローチャート段階では選択対象がアンカー付きオブジェクトやテキストだった場合を想定できていなかった。

わかったこと

  • 似たようなプロパティ・メソッドあれこれ

    • reflect.name :TextFrame
    • constructor.name :TextFrame
    • getElements() :[object TextFrame]
    • typeof :object
    • toSpecifier() :/document[@id=37]//text-frame[@id=4341]
  • spreadにnameプロパティはない

  • storyにselect()はない

ひっかかったところ

  • toSpecifier()

めちゃめちゃ便利だけど、いまひとつどういったものなのか分からず今回はうまく活用できなかった。 オブジェクトモデルビューアによると「Retrieves the object specifier」…

$.writeln(objs[j].toSpecifier());

とすると、

/document[@id=37]//text-frame[@id=4341]

となる。 「//」の間にspreadが来る気がするのだけど…

  • 特定のメソッドを持たないオブジェクトのタイプの探し方

select()が使えないオブジェクトの種類を見つけたかったのだけど、どう探せばいいのか分からなかった。 とりあえずstory以外にもselect()が使えないものを見つけたときに処理を追加できるようswitch文にしておいた。

参考

イチからわかる!InDesign JavaScript指南書