Skip to main content
Inspiring
November 26, 2022
Answered

【JavaScript】上書き保存が出来る時と出来ない時がある

  • November 26, 2022
  • 4 replies
  • 2226 views

お世話になります。

 

保存時のオプションを変えて上書き保存するというスクリプトを作って、実際仕事の中で使用していたのですが、時々エラーが出ることがありました。

 

//保存時のオプション設定
var options = new IllustratorSaveOptions ;
with (options) { 
    pdfCompatible = true ; //PDF互換ファイル:作成

    embedLinkedFiles = false ; //配置した画像:埋め込まない

    embedICCProfile = true ; //ICCプロファイル:埋め込む

    compressed = true ; //圧縮を使用:する
}

var docObj = app.documents;
var arrTmp = []; //空の配列

for (i=0; i < docObj.length ; i++){
    arrTmp.push(docObj[i]);
};

for (i=0; i < arrTmp.length ; i++){
    app.activeDocument = arrTmp[i];

    var myDoc = arrTmp[i];
    var myFile = myDoc.fullName ;
    var aiPath = myFile.fullName ;
    var aiFile = new File(aiPath);

    myDoc.save(options);
};

 

実行後のエラーとしては、「保存されていないファイルなので上書きできませんよ」的なことだったと思います。

それで、optionsのところが不明です(?)みたいな記載がされてました。

 

なぜかは分かりませんが、一度そのファイル達をデスクトップにコピーしてから上記のスクリプトを実行してみると、普通に保存することが出来ました。

 

デスクトップでやったものに関しても、エラーが出た時に関しても、客先から送られてきたデータをコピーして、そのコピーしたものを上書きしていく流れは変わらないのですが・・・。

 

何が原因かわかる方いらっしゃいますか。

よろしくお願いします。

This topic has been closed for replies.
Correct answer nekkoneko

上書き保存ができないケースがあった問題ですが、

客先から送られてきたデータをまとめているフォルダ名に、半角のスラッシュ「/」が入っているのが原因でした。そのスラッシュがファイル自体のパスに影響してしまったようです。

 

よく考えたら分かる問題でした。

お騒がせいたしました。申し訳ないです。

4 replies

nekkonekoAuthorCorrect answer
Inspiring
November 29, 2022

上書き保存ができないケースがあった問題ですが、

客先から送られてきたデータをまとめているフォルダ名に、半角のスラッシュ「/」が入っているのが原因でした。そのスラッシュがファイル自体のパスに影響してしまったようです。

 

よく考えたら分かる問題でした。

お騒がせいたしました。申し訳ないです。

ajabon grinsmith
Community Expert
Community Expert
November 29, 2022

これ見て初めて思い出したんですが自分も過去に経験済みでした……肝心な時にお役に立てず。

ちなみにスクリプトのファイル名に半角スラッシュを入れておくと起動時にアプリがクラッシュします(役に立たない情報)

Ten A
Community Expert
Community Expert
November 28, 2022

とりあえず、コードを見ての疑問に感じた部分を書きます。

Documents自体がコレクションであり構造は配列ですが、これを新たに配列に取り込むのは何か意図がありますか?
myDoc、myFile、aiPath、aiFileの各変数はなんのために用意されているでしょう?

メッセージから言うと開いているドキュメントの中に新規ドキュメントでまだ保存されたことがないものが混じっていたということになるかと思います。パーミッションやその他ディレクトリへのアクセスの問題であれば日本語でメッセージが表示されて保存自体がキャンセルされるはずです。

nekkonekoAuthor
Inspiring
November 28, 2022

ありがとうございます。

コードに関してなのですが、スクリプトを勉強して間もない頃に、配列に取り込むっていうのをここで教えていただいて、おそらく当時の私は習ったことを実際に使ってみたくてそうしたのだと思います。documentsが配列であることも知らなかったので。。。

 

で変数のことですが、これはネットに落ちてたのをそのまま使用した記憶があります。上書き保存の仕方と、オプションを変えて保存するというコードが分からず・・調べて辿り着いたのがこのコードだったので使ってました。

 

一番最初にこのコード書いてから、今まで特に不自由なく仕事の中でも使用出来てしまっていたので、正直違和感も感じず書き直すという頭もなくて・・(汗)過去に書いてきたスクリプトもちょっと見直してみます。

 

日本語でメッセージは表示されなかったので、別の問題なんでしょうね。

時間がある時にいろいろ試してみます。

 

Ten A
Community Expert
Community Expert
November 29, 2022

基本的にオブジェクト名称が複数形になっているものはコレクションです。documentsやtextFrames等がそうですね。メソッドの引数に関しては調べないと厳密なことはわかりませんが、定義された変数がそれ以降出てこない場合は利用していないものだと判断可能です。無駄な処理というのはメモリも消費したり、実行速度を低下させたりとリスクになります。
コツとしてはIllustratorになったつもりで上から順番に辿ることです。そうすることで処理の流れが把握しやすく、不必要な処理等も分かるようになるでしょう。

monokano
Community Expert
Community Expert
November 26, 2022

スクリプト以外のところに原因がありそうです。

OSとIllustratorのバージョンによるのかもしれません。このあたりの情報も書いた方がよいでしょう。

nekkonekoAuthor
Inspiring
November 28, 2022

ありがとうございます。

 

OSはBig Sur バージョン11.6.7で、

イラレは26.5.2でした。

 

ちなみにエラー時のアラートですが、私の和訳の解釈が違っているかもしれないので、一応ここに記しておきます。

 

Error 9031: You must provide a file path for documents which have not yet been saved

Line: 34 -> myDoc.save(options);

monokano
Community Expert
Community Expert
November 28, 2022

「まだ保存されていないドキュメントは、ファイルパスを指定する必要があります」ってことなので、optionsは関係なく、save自体のエラーですね。

 

saveはファイルとして存在していないドキュメントに実行するとたしかにエラーになるのですけど、確実にファイルがあるのにエラーが出てしまうとのことですよね。

やはりスクリプトではなく環境側(ボリュームやフォルダの状態とか)に原因がある気がします。

Ten A
Community Expert
Community Expert
November 26, 2022
コード自体の検証はしていませんが、ファイル自体がロックされていたりパーミッションが異なるなど無いですか?
nekkonekoAuthor
Inspiring
November 28, 2022

ありがとうございます。

ファイルがロックされていることはなく、(自分)は読み/書きのアクセス権があって、staffとeveryoneは読み出しのみになっていました。これはデスクトップにコピーした時も同様です。