終了

ExtendScript everyItem()について

積極的な参加者 ,
Nov 24, 2022 Nov 24, 2022

リンクをクリップボードにコピー

コピー完了

ページにあるテキストフレームの設定を一括でしようと

 

var myTextFrameForCopy = app.activeDocument.pages.firstItem().textFrames.add({contents:"ねこねこ"});
var myTextFrame = app.activeDocument.pages.firstItem().textFrames.add({contents:"猫猫"});
app.activeDocument.pages.firstItem().textFrames.everyItem().textFramePreferences.properties = {
    autoSizingType : AutoSizingTypeEnum.HEIGHT_AND_WIDTH,
    autoSizingReferencePoint : AutoSizingReferenceEnum.TOP_LEFT_POINT,
    useNoLineBreaksForAutoSizing : true
}

 

としたのですが上手くいきません。

 

everyItem()を使わずにforでぐるぐるするしか方法はありませんでしょうか?

キーワード
スクリプティング

表示

803

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 2 件の正解

参加者 , Nov 28, 2022 Nov 28, 2022

>everyItem()に、コレクション以外の要素(parentStoryやtextFramePreferences等)をつなげた場合は配列が返ってくる。
>everyItem()に、コレクションの要素(characters等)をつなげた場合はコレクションが返ってくる。

 

そう、だからPreferenceのコレクションであるpreferencesをつなげばいいのです。

var myTextFrameForCopy = app.activeDocument.pages.firstItem().textFrames.add({contents:"ねこねこ"});
var myTextFrame = app.activeDocument.pages.firstItem().textFrames.add({contents:"猫猫"});
app.activeDocument.pages.firstItem().textFrames.everyItem().preferences.item(4).properties = {
    autoSizingType : AutoSizingTypeEn
...

投票

翻訳

翻訳
参加者 , Dec 15, 2022 Dec 15, 2022

ありゃ、これでもいけてしまった。

こちらの方がよほど可読性高くていいですね。

var myTextFrameForCopy = app.activeDocument.pages.firstItem().textFrames.add({contents:"ねこねこ"});
var myTextFrame = app.activeDocument.pages.firstItem().textFrames.add({contents:"猫猫"});
app.activeDocument.pages.firstItem().textFrames.everyItem().properties={textFramePreferences:{
    autoSizingType : AutoSizingTypeEnum.HEIGHT_AND_WIDTH,
    autoSizingReferencePoint : AutoSizingReferenceEnum.TOP_LEFT_POINT,
    useNoLineBreaksForAutoSizing : true
}}

 

投票

翻訳

翻訳
積極的な参加者 ,
Nov 24, 2022 Nov 24, 2022

リンクをクリップボードにコピー

コピー完了

ドキュメントのディフォルトのテキストフレーム設定をするなら

 

app.activeDocument.textFramePreferences.properties = {
    autoSizingType : AutoSizingTypeEnum.HEIGHT_AND_WIDTH,
    autoSizingReferencePoint : AutoSizingReferenceEnum.TOP_LEFT_POINT,
    useNoLineBreaksForAutoSizing : true
}

 

 で良さそうです。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 24, 2022 Nov 24, 2022

リンクをクリップボードにコピー

コピー完了

琥珀猫太郎さん

 

everyItem() メソッドの戻り値を見ていただければ分かるかもと思います。

everyItem() メソッドは、そのコレクションオブジェクトに連なる各オブジェクトのプロパティごとに配列を生成するメソッドです。

スクリーンショット 2022-11-25 13.38.45.png

 

実体化させるには getElements() メソッドが必要です。

例えばこんな感じ。

var res = app.activeDocument.pages.firstItem().textFrames.everyItem().getElements();
res[0].textFramePreferences.properties = {
    autoSizingType : AutoSizingTypeEnum.HEIGHT_AND_WIDTH,
    autoSizingReferencePoint : AutoSizingReferenceEnum.TOP_LEFT_POINT,
    useNoLineBreaksForAutoSizing : true
}

実行後

スクリーンショット 2022-11-25 13.43.00.png

 

everyItem() のいいところは、それぞれのプロパティがただの配列になるという点に尽きます。例えば、Document.fonts の中から特定の名前のフォントを見つけたいというとき、単純に Documents.fonts をfor文で回すより、Documents.fonts.everyItem().name などでfor文を回したほうが何倍も高速です。

昔の拙記事で恐縮ですが、ここにも少し書いてあります。

https://uske-s.hatenablog.com/entry/2018/03/29/211054#everyItem%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89

ご参考まで。

 

Yusuke S.

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Nov 24, 2022 Nov 24, 2022

リンクをクリップボードにコピー

コピー完了

補足します。

プロパティの書き換えについてはyusuke.sさんの書かれた通りなんですが、メソッドは通るので、

ちょい手間ですが自動サイズ調整が設定されたオブジェクトスタイルを作成して、

 

var doc = app.activeDocument;
var myTextFrameForCopy = doc.pages.firstItem().textFrames.add({contents:"ねこねこ"});
var myTextFrame = doc.pages.firstItem().textFrames.add({contents:"猫猫"});
var myStyle = doc.objectStyles.add({
    name: "左上でぴったり", 
    enableTextFrameAutoSizingOptions : true,
    textFramePreferences : {
        autoSizingType : AutoSizingTypeEnum.HEIGHT_AND_WIDTH,
        autoSizingReferencePoint : AutoSizingReferenceEnum.TOP_LEFT_POINT,
        useNoLineBreaksForAutoSizing : true
    }
});

doc.pages.firstItem().textFrames.everyItem().applyObjectStyle(myStyle);

 

という感じでならeveryItem() を活かせます。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 25, 2022 Nov 25, 2022

リンクをクリップボードにコピー

コピー完了

ajabon grinsmithさん

>メソッドは通るので

 

はい、便利ですよね。

 

var myTextFrameForCopy = app.activeDocument.pages.firstItem().textFrames.add({contents:"ねこねこ"});
var myTextFrame = app.activeDocument.pages.firstItem().textFrames.add({contents:"猫猫"});
app.activeDocument.pages.firstItem().textFrames.everyItem().properties = {
    geometricBounds : [0, 0, 100, 100],
};

 

の様にプロパティも設定できるので、textFramePreferencesも設定できるかと考えたのですが上手くいきませんでした。


>という感じでならeveryItem() を活かせます。

 

大変興味深いです。
「三人寄れば文殊の知恵」、思いもよらなかったアイデアが出てくるのがコミュニティーの醍醐味ですね

 

objectStyles.addの際にtextFramePreferencesを設定出来るというのも大変参考になりました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 24, 2022 Nov 24, 2022

リンクをクリップボードにコピー

コピー完了

yusuke.sさん

getElements()の使い方、参考になりました

 

>Documents.fonts をfor文で回すより、Documents.fonts.everyItem().name などでfor文を回したほうが何倍も高速です。

 

比較してあるサイトがありました。

https://www.autodtp.app/2021/10/indesignjavascripeveryitem.html 

 

大変有益な情報を頂きました、有難うございました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Nov 24, 2022 Nov 24, 2022

リンクをクリップボードにコピー

コピー完了

everyItem()メソッドで帰ってくるのはtextFrameですが子要素がコレクションになります。で、0番目の設定を触るには…

app.activeDocument.textFrames.everyItem().textFramePreferences[0]

という具合に配列へのアクセスになります。
ので、ページ内のtextFramesでぐるぐるした方がわかりやすいです。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 24, 2022 Nov 24, 2022

リンクをクリップボードにコピー

コピー完了

Ten Aさん

parentStoryをつなげた場合も同様に、一括で変更が出来ませんでした。

 

charactersをつなげた場合は、一括で変更等出来るのに・・・

var myTextFrameForCopy = app.activeDocument.pages.firstItem().textFrames.add({
    contents:"ねこねこ",
    geometricBounds : [0, 0, 100, 100],
});
var myTextFrame = app.activeDocument.pages.firstItem().textFrames.add({
    contents:"猫猫",
    geometricBounds : [0, 0, 100, 100],
});
app.activeDocument.pages.firstItem().textFrames.everyItem().characters.everyItem().contents = "○";

 

 

そういう仕様なのかな

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 25, 2022 Nov 25, 2022

リンクをクリップボードにコピー

コピー完了

皆様のご意見を参考にして

 

everyItem()に、コレクション以外の要素(parentStoryやtextFramePreferences等)をつなげた場合は配列が返ってくる。

everyItem()に、コレクションの要素(characters等)をつなげた場合はコレクションが返ってくる。

everyItem()に、プロパティをつなげた場合は、一括で入力出来る。

everyItem()に、メソッドをつなげた場合は、一括で操作出来る。

 

コレクションのItemのすべてを操作する場合は

everyItem()を使わずfor等で、ぐるぐるするより

everyItem()を使ったのち、for等で、ぐるぐるするのが良い。

(everyItem()に、プロパティやメソッドをつないで、一括で出来る場合は除いて)

 

配列で返ってきた場合、UXP Scriptなら、配列に対してforEachが使えそうですが・・・

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Nov 28, 2022 Nov 28, 2022

リンクをクリップボードにコピー

コピー完了

>everyItem()に、コレクション以外の要素(parentStoryやtextFramePreferences等)をつなげた場合は配列が返ってくる。
>everyItem()に、コレクションの要素(characters等)をつなげた場合はコレクションが返ってくる。

 

そう、だからPreferenceのコレクションであるpreferencesをつなげばいいのです。

var myTextFrameForCopy = app.activeDocument.pages.firstItem().textFrames.add({contents:"ねこねこ"});
var myTextFrame = app.activeDocument.pages.firstItem().textFrames.add({contents:"猫猫"});
app.activeDocument.pages.firstItem().textFrames.everyItem().preferences.item(4).properties = {
    autoSizingType : AutoSizingTypeEnum.HEIGHT_AND_WIDTH,
    autoSizingReferencePoint : AutoSizingReferenceEnum.TOP_LEFT_POINT,
    useNoLineBreaksForAutoSizing : true
}

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 28, 2022 Nov 28, 2022

リンクをクリップボードにコピー

コピー完了

kawamoto_αさん
>そう、だからPreferenceのコレクションであるpreferencesをつなげばいいのです。

 

preferencesコレクションは、使った事がありませんでした。

 

alert(app.activeDocument.pages.firstItem().preferences.count());

 

とすると、2と返ってきます。

pageには「marginPreferences」と「preferences」の2つのpreferencesがあるので、その名前の通りpreferencesのコレクションなのですね

 

app.activeDocument.pages.firstItem().preferences.item(0).properties = {
    bottom : 100
}

 

とすると確かにマージンが変わりますね

 

色々と他の方の書かれたscriptも見ているつもりですが(英語のフォーラムも含めて)preferencesコレクションを使っているのを見たことが無いように思います、InDesignのExtendScriptの書籍でも見たことが無い様な・・・

他のアプリのExtendScriptでは、良く使われている書き方なのでしょうか

ただ、どれがどのpreferencesなのか、さっぱり・・・総当たりで試すしかないのかな

 

大変有益な情報を頂き真に有難うございました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Nov 28, 2022 Nov 28, 2022

リンクをクリップボードにコピー

コピー完了

page.preferencesに含まれるのはMarginPreferenceとGridDataInformationですね。
必ずしもpreferenceと付いてるわけじゃないのがややこしいところです。

総当たりしなくても、

alert(app.activeDocument.pages.firstItem().preferences.everyItem().getElements());


を実行すると分かります。
(.getElements()を付けて実体が何か調べるというのはpageItemsコレクションからオブジェクトを取得したときなどにも使われるやり方です)

 

ちなみにpreferencesがよそで使われてるのは私も見たことがありません。Preferenceの順序調べるのが面倒ですし、自分でもほぼ使ってません。こういう書き方ができることは結構前に気づいたのですが、披露する機会があってよかったです。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Nov 29, 2022 Nov 29, 2022

リンクをクリップボードにコピー

コピー完了

kawamoto_αさん

 

>ちなみにpreferencesがよそで使われてるのは私も見たことがありません。Preferenceの順序調べるのが面倒ですし、自分でもほぼ使ってません。こういう書き方ができることは結構前に気づいたのですが、披露する機会があってよかったです

 

大変参考になりました、有難うございました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
参加者 ,
Dec 15, 2022 Dec 15, 2022

リンクをクリップボードにコピー

コピー完了

最新

ありゃ、これでもいけてしまった。

こちらの方がよほど可読性高くていいですね。

var myTextFrameForCopy = app.activeDocument.pages.firstItem().textFrames.add({contents:"ねこねこ"});
var myTextFrame = app.activeDocument.pages.firstItem().textFrames.add({contents:"猫猫"});
app.activeDocument.pages.firstItem().textFrames.everyItem().properties={textFramePreferences:{
    autoSizingType : AutoSizingTypeEnum.HEIGHT_AND_WIDTH,
    autoSizingReferencePoint : AutoSizingReferenceEnum.TOP_LEFT_POINT,
    useNoLineBreaksForAutoSizing : true
}}

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines