Skip to main content
Known Participant
March 11, 2022
Answered

【スクリプト】選択されたオブジェクトの中からグループアイテムだけを取得したい

  • March 11, 2022
  • 2 replies
  • 2880 views

javascriptでイラレのスクリプトを書きたいのですが、

選択されているオブジェクトの中からグループアイテム(入れ子含む)を取得するには、どう書いたらいいでしょうか?

 

全くの初心者なので教えていただけると幸いです。

This topic has been closed for replies.
Correct answer ajabon grinsmith

とりあえず初心者向けということであれば、自分がよくやっている書き方がちょうどいいかと…w

再帰処理ともちょっと違う感じですが。

var sel = app.activeDocument.selection; //選択オブジェクト配列
var groups = []; //見つけたグループをためておく空配列を宣言

getGroups(sel); //グループ取得の関数
alert(groups.length + "こ!"); //取得したグループの個数を叫ぶ

function getGroups(obj){ //例の関数
    for(var i = 0; i < obj.length; i++){ //ループ
        if(obj[i].reflect.name == "GroupItem"){
            groups.push(obj[i]); //配列へ追加
            getGroups(obj[i].pageItems); //グループの中身でまた関数
            }
        }
    }

 

上記では、GroupItemのPageItemsコレクションとSelection配列とを、ひとつの関数を使いまわしてループ処理しています。

実際、Ten A先生の示されるとおりのアプローチのほうがスマートだと思います。(たぶんgroupsではなくgroupItemsコレクションですw)

 

おすすめしたいのは、初心者なりに、どこまでやってみたかを書いておくことです。

そうすればそのレベルに合わせて、ちょっとだけ上達できるような、わかる範囲でおさまる回答が得られるかと(たぶん…)。

2 replies

ajabon grinsmith
Community Expert
ajabon grinsmithCommunity ExpertCorrect answer
Community Expert
March 11, 2022

とりあえず初心者向けということであれば、自分がよくやっている書き方がちょうどいいかと…w

再帰処理ともちょっと違う感じですが。

var sel = app.activeDocument.selection; //選択オブジェクト配列
var groups = []; //見つけたグループをためておく空配列を宣言

getGroups(sel); //グループ取得の関数
alert(groups.length + "こ!"); //取得したグループの個数を叫ぶ

function getGroups(obj){ //例の関数
    for(var i = 0; i < obj.length; i++){ //ループ
        if(obj[i].reflect.name == "GroupItem"){
            groups.push(obj[i]); //配列へ追加
            getGroups(obj[i].pageItems); //グループの中身でまた関数
            }
        }
    }

 

上記では、GroupItemのPageItemsコレクションとSelection配列とを、ひとつの関数を使いまわしてループ処理しています。

実際、Ten A先生の示されるとおりのアプローチのほうがスマートだと思います。(たぶんgroupsではなくgroupItemsコレクションですw)

 

おすすめしたいのは、初心者なりに、どこまでやってみたかを書いておくことです。

そうすればそのレベルに合わせて、ちょっとだけ上達できるような、わかる範囲でおさまる回答が得られるかと(たぶん…)。

1755Author
Known Participant
March 11, 2022

すみません、確かに自分で作ったものも書くべきでしたよね。

次回からは気をつけます。

 

同じ結果になるのに書き方が結構違うんですね!

関数とかも勉強中なのでありがたいです。

Ten A
Community Expert
Community Expert
March 11, 2022

処理にもよりますが、多くの場合selectionコレクションを操作するよりdocument配下のgroupItemsコレクションからselectedプロパティがtrueのものを抜き出す方が操作しやすくなるでしょう。

 

var tg = [];
var gp = app.activeDocument.groupItems;
for (var i=0;i<gp.length;i++) if(gp[i].selected)tg.push(gp[i]) 
alert(tg)

 

 

こんな感じだと入れ子も確実に拾います。

1755Author
Known Participant
March 11, 2022

思っていた動きになりました。

gp[i].selected だけでtrueになるんですね。

gp[i].selected == true みたいな書き方して出来なかったので困ってました。

ありがとうございます。

Ten A
Community Expert
Community Expert
March 11, 2022

フラグ系のプロパティというのは値自体が真偽値(boolean)ですから条件判断にそのまま利用可能です。
ドキュメントにグループを1つだけ作って選択した状態で「alert(app.activeDocument.groupItems[0].selected==true)」を実行してみるとどうですか?
また、選択を外して実行するとどうなったか確認してみるとよいでしょう。