033.【ID】クリップボード内の複数行テキストを1行ずつペースト
挙動
①あらかじめ aaa[改行]bbb[改行]ccc をコピーしておく
②スクリプト実行
③任意の場所でフォーマットなしでペーストすると、「aaa」が貼り付けられる
④任意の場所でフォーマットなしでペーストすると、「bbb」が貼り付けられる
⑤任意の場所でフォーマットなしでペーストすると、「ccc」が貼り付けられる
⑥全ての行をペーストしおえたらイベントリスナーを破棄
書いたコード
//@targetengine 'continuousPaste' var doc = app.activeDocument; var pasteAction = app.menuActions.item("$ID/Paste&Unformatted"); // クリップボード取得 var lay = doc.layers.add({name: "temp"}) var tf = doc.pages[0].textFrames.add({ itemLayer: lay, visibleBounds: [0, 0, 10, 10] }); tf.insertionPoints[0].select(); app.paste(); var clips = tf.parentStory.contents.split("\r"); lay.remove(); var firstScpt = 'CreateObject("WScript.Shell").Exec("clip").StdIn.Write "' + clips[0] + '"'; app.doScript(firstScpt, ScriptLanguage.VISUAL_BASIC); // イベントリスナー追加 var listener = pasteAction.addEventListener( "afterInvoke", hoge ); var countUp = function () { var count = 0; return function () { return count += 1; }; $.writeln("やったか!?") // これが動いてない? }(); function hoge() { if (countUp() < (clips.length - 1) * 2) { var scpt = 'CreateObject("WScript.Shell").Exec("clip").StdIn.Write "' + clips[countUp() / 2] + '"'; app.doScript(scpt, ScriptLanguage.VISUAL_BASIC); } else { listener.remove(); } }
メモ
分かったこと
- テキストフレーム内のテキストを取得する際、オーバーフローしたテキストも欲しい場合はparentStoryを見る
分からなかったこと
- addEventListnerの引数のハンドラ、「hoge()」のようにパーレンをつけるとうまくいかない。なぜ?
- EventListener、targetengine周りの理解が全体的にあいまいなまま
- targetengineを使うスクリプトのデバッグをするとき、修正するたびにIdを落としてまた立ち上げて…という手間をかけているのだが、このやりかたが適切なのか。変数をリセットするよいやり方(null入れてもだめっぽい)
- 関数の戻り値を参照じゃなくて値として使いたいが、どうすればよいか分からない。使おうとするたびに関数が走ってしまって困る。
積み残し
参考
- スクリプトもくもく会#5を開催しました(1)#スクリプトから直接クリップボードにテキストを送る方法は - DTPab
- お~まち@ID JS本DL販売中!さんのツイート 2017/9/12
クリップボードの操作はこちらのものを使わせていただきました。 - overflowしたテキスト | Adobe Community
- menuActionTitleToString
- Indiscripts :: How to Create your Own InDesign Menus
- eventListener. Copy/Paste detection. POSIBLE??? | Adobe Community
- eventListenerを利用してIndesignの挙動を変える - 手抜きLab@DTPの現場
- O'Reilly Japan - 開眼! JavaScript
countUp関数はこちらに記載のもの。 - DTPerのスクリプトもくもく会スピンオフ スライド資料 - Uske_S’s DTP Scripts - BOOTH