2

イベントを含むスクリプト(私が書いていません)がありapp.addEventListener('afterOpen', addVariables);ます (関数の名前は addVariables です)。

app.addEventListener('afterSave', addVariables);「終わりのない」ループを作成していることを除いて、希望どおりに機能するように変更しました。

基本的に何が起こっているかというと、スクリプトがユーザーの名前 (例: Tia) を取得し、それを可変テキストとして InDesign CC のペーストボードに追加します。「afterOpen」コマンドを使用すると、ドキュメントを開くたびに名前が更新されました。ドキュメントを最後に開いたのは誰かではなく、ドキュメントを最後に保存したのは誰なのか知りたいので、これはスクリプトの目的に反します。このスクリプトは、最後に保存した人の名前を表示するという点で、「afterSave」コマンドで適切に機能します。ただし、誰かがドキュメントを保存しようとするたびに、スクリプトがループし続ける*という新しい問題が発生しました。

そこで、私の質問は次のとおりです。ドキュメントごとに 1 回だけ実行するように eventListener を指定できますか?


私は javascript には詳しくありませんが、applescript についてはかなり理解しています。

助けてくれてありがとう!


osx 10.8.4 を実行する iMac • Adob​​e InDesign CC • Adob​​e ExtendScipt Toolkit を使用して編集する



*誰かがドキュメントを保存すると、スクリプトが実行され、テキスト変数が変更され、InDesign がドキュメントへの変更として (正しく) 記録するため、ループします。そのため、ドキュメントには「未保存」のフラグが付けられます (ドキュメント名の横にアスタリスクが付いています)。アスタリスクを「クリア」するためにもう一度保存するために command + s を押すと、eventListener は afterSave コマンドを取得し、ドキュメントを再度更新します。これにより、InDesign は変更として取得し、未保存としてフラグを立てます...ループの意味を見てください。ドキュメントを閉じるように指示し (command + w)、閉じる前に保存するように指示すると、保存してから閉じます。ただし、ドキュメントを一度だけ保存し、可変テキストを更新してから、ドキュメントがまだ開いている間にそのドキュメントにさらに変更が加えられた場合は、、スクリプトは再度実行されません。明らかに、新しいドキュメントごとにスクリプトを 1 回実行する必要があります。

4

3 に答える 3

1

これは、スクリプトが特定のドキュメントのユーザー名を更新したかどうかを追跡することで解決できます。すでに更新している場合は、再度更新する前に停止してください。それ以外の場合は、更新を続行します。

JavaScript は次のようになります。

#targetengine "session"

(function(){
  // Keep track of the files where we've updated
  // the user's name onto the pasteboard.
  var isUserNameUpdated = {};

  app.addEventListener('afterSave', function(theEvent) {
    var filename = theEvent.fullName;
    if (isUserNameUpdated[filename] === true) {
      return;
    }
    isUserNameUpdated[filename] = true;

    // Put the rest of your code here
  });

  app.addEventListener('afterOpen', function(theEvent) {
    // afterOpen fires twice: once when the document opens
    // and once when the window loads. Only the first event
    // has the fullName property. So don't run the second time,
    // to avoid causing an error.
    //
    // See: http://forums.adobe.com/message/5410190
    if (theEvent.target.constructor.name !== 'Document') {
      return;
    }

    // If we've previously saved the file, closed it,
    // then opened it again, then forget that we had 
    // saved it previously.
    var filename = theEvent.properties.fullName;
    isUserNameUpdated[filename] = false;
  });
})();
于 2014-04-24T13:45:46.257 に答える
1

問題は、すべての保存アクションがリスナーを起動するため、保存されていないドキュメントを際限なく保存する必要があることです。解決策は、リスナーを無効にして、イベントを発生させずに強制的に保存し、その直後に有効にすることです。

function addVariables(openEvent){
	
    var doc = openEvent.parent;
    
    while ( doc.constructor.name != "Document" )
    {
	    if ( doc.constructor.name == "Application" ){ return; }
	   
	   doc = doc.parent;
	}
	//Adding User name to text variables
	createTextVariable(doc, "User name", (Folder.myDocuments).parent.displayName );
	
  //Removing the afterSave listener
	removeAfterSaveEventListener();
  
  //Saving document without firing event listener
	doc.save();
  
  //Adding the afterSave listener
	addAfterSaveEventListener();
}
var removeAfterSaveEventListener = function() {
  var el = app.eventListeners.item ( "onAfterSave" );
	el.isValid && el.remove();
}

var addAfterSaveEventListener = function() {
  app.addEventListener('afterSave', addVariables).name = "onAfterSave";
}

//Adding the afterSave listener
addAfterSaveEventListener();

于 2017-05-05T09:11:59.897 に答える
0

少なくとも Applescript には、イベント リスナーをbeforeSaveに反応させるオプションがあります。

tell application "Adobe InDesign CC 2017"
        make event listener with properties {event type:"beforeSave", handler:myHandler}
    end tell

これでうまくいくはずです。

于 2017-05-05T07:05:57.357 に答える