InDesignスクリプトアイコン

前回作った「連結テキストフレーム作成」のjsxスクリプトをchatGPTの力を借りてUXPスクリプトに書き直してみた!

今回は前回作った「linkedText.jsx」をUXPスクリプトの勉強がてらにchatGPTで翻訳してどーにかしようという試みです。


chatGPTと対話

<chat GPT>

まずはchatGPTと対話してjsxスクリプトをUXPスクリプトに翻訳してもらいました。

UXPスクリプトはpromptが実装されてないので、入力ダイアログを実装する前のコードでやってみました。返ってきたのスクリプトコードが下記。

const {Text,Color}=require("scenegraph");
// テキストフレームを作成する関数
function createTextFrame(page,x,y,width,height){
  const textFrame=new Text();
  textFrame.fill=new Color("black"); // テキストの色を設定
  textFrame.resize(width,height);
  textFrame.placeInParentCoordinates({x,y});
  // ページにテキストフレームを追加
  page.addChild(textFrame);
  return textFrame;
};
// ページをまたいでテキストフレームを連結する関数
function linkTextFramesAcrossPages(textFrames){
  for(let i=0;i<textFrames.length-1;i++){
    const currentFrame=textFrames[i];
    const nextFrame=textFrames[i+1];
    currentFrame.nextTextFrame=nextFrame;
  };
};
// ドキュメントの参照を取得
const myDoc=require("application").activeDocument;
// ページ数を取得
const pageCount=myDoc.pages.length;
// ページごとに処理
const pushTextFrames=[];
for(let i=0;i<pageCount;i++){
  const page=myDoc.pages[i];
  pushTextFrames.push(createTextFrame(page,36,36,180,50)); // テキストフレームを作成して配列に収める
};
// テキストフレームを連結
linkTextFramesAcrossPages(pushTextFrames);

嫌な予感しかしませんがとりあえず実行。やはりエラー発生!何も起こりませんでした。

この後、何回か対話してみましたが良好な結果が得られず…。やっぱりUXPはまだまだchatGPTが学べるほど情報が少ないということでしょうか。

とっいうわけで少し早いですが、ここからは人間様の手で修正します。

スポンサーリンク

ここからは人間様の出番だ!(今月2回目)

まずは

const {Text,Color}=require("scenegraph");

これは何だか意味が分からないので削除。代わりに

const {app}=require("indesign");

まずはappを定義する。次のテキストフレームを作成する関数はダメダメでした、ほぼ書き直し。

async function createTextFrame(page,x,y,width,height) {
  var textFrame=page.textFrames.add();
  textFrame.geometricBounds=[y,x,y+height,x+width];
  return textFrame;
}

というかjsxと変わらんやんけ、asyncとletくらい。次の連結する関数もダメ!書き直し。

async function linkTextFramesAcrossPages(textFrames){
  for(let i=0;i<textFrames.length-1;i++){
      textFrames[i].nextTextFrame=textFrames[i+1];
  };
};

これもjsxと変わらん。そんでアクティブドキュメントを定義する。

const myDoc=app.activeDocument;

ページ取得もダメみたいですね

const page=myDoc.pages[p];

ではなくUXPでは下記のような感じでした。

const page=myDoc.pages.item(p);

他にもasync・await問題もありいろいろ手を加えて、やっと上手くいきました。

完成形のコードがこちら

const {app}=require("indesign");
linkedText();
// テキストフレームを作成する関数
async function createTextFrame(page,x,y,width,height){
  var textFrame=page.textFrames.add();
  textFrame.geometricBounds=[y,x,y+height,x+width];
  return textFrame;
};
// ページをまたいでテキストフレームを連結する関数
async function linkTextFramesAcrossPages(textFrames){
  for(let i=0;i<textFrames.length-1;i++){
      textFrames[i].nextTextFrame=textFrames[i+1];
  };
};
async function linkedText(){
  try{
    // ドキュメントの参照を取得
    const myDoc=app.activeDocument;
    // ページ数を取得
    const pageCount=myDoc.pages.length;
    const pushTextFrames=[];
    for(let p=0;p<pageCount;p++){
      pushTextFrames.push(await createTextFrame(myDoc.pages.item(p),36,36,180,50));// テキストフレームを作成して配列に収める
    };
    // テキストフレームを連結
    await linkTextFramesAcrossPages(pushTextFrames);
  }catch(e){
    alert(e);
  };
};

これで狙い通りに動きます。

関数を使うときは必ず「async」を付け、呼び出すときは「await」を使わないとダメですね。スープ出来てないのにラーメンが茹で上がっちゃいます。

jsxとテキスト差分してみる

しかしこのくらいのコードなら意外とUXPでも変わらんじゃないか!
そこでテキスト差分をしてみたところ

varとletとか配列の初期化とかどっちでもいいとこ抜いたら、ほとんど変わらんし。ページの取得が違うくらいでchatGPTで余計回り道やん。

次回はのUXP版・取り消し一発「doscript」と入力ダイアログについて。まだ続きます…

スポンサーリンク

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です