コモノExtendScript100本ノック

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

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入れてもだめっぽい)
  • 関数の戻り値を参照じゃなくて値として使いたいが、どうすればよいか分からない。使おうとするたびに関数が走ってしまって困る。

積み残し

  • クリップボードの中身を取得するために、新しくTFを作成する以外の方法がとれないか
  • unicode対応?
  • countUpを使う必要があったのか。もう少しいいやり方がありそうなものだが

参考