コモノExtendScript100本ノック

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

007.【ID】リンク先が同階層のLinkフォルダ内でなかったらアラート

追記(2021/09/13)

書き直しました。

書いたコード

var myDoc = app.activeDocument;
if (!myDoc.saved) {
  alert("保存して")
} else {
  var inddFolder = myDoc.filePath.fsName;
  var inddFolderReg = inddFolder.split("\\").join("\\\\")
  var myLinks = myDoc.links;
  var LinksLen = myLinks.length;
  var logTxt = "";
  for (var i = 0; i < LinksLen; i++) {
    var correctPathReg = new RegExp(inddFolderReg + "\\\\(L|l)inks*\\\\" + myLinks[i].name)
    switch (myLinks[i].status) {
    case LinkStatus.LINK_MISSING: // リンク先がない
      logTxt = logTxt + myLinks[i].name + " リンク先がない\n";
      break;
    case LinkStatus.LINK_INACCESSIBLE: // URL/画像のパスにアクセスできない
      logTxt = logTxt + myLinks[i].name + " アクセスできない\n";
      break;
    case LinkStatus.LINK_OUT_OF_DATE: // 画像の更新が必要
      if (myLinks[i].filePath != correctFolder + myLinks[i].name) {
        logTxt = logTxt + myLinks[i].name + " "  + myLinks[i].filePath + " 要更新\n";
      } else {
        logTxt = logTxt + myLinks[i].name + " 要更新\n";
      }
    case LinkStatus.NORMAL: // 最新状態
      if (!correctPathReg.test(myLinks[i].filePath)) {
        logTxt = logTxt + myLinks[i].name + " "  + myLinks[i].filePath + "\n";
      }
      break;
    }
  }
}
if (logTxt == "") {
  alert("リンクは正常でした")
} else {
  alert(logTxt)
}

メモ

分かったこと

  • documentのfullNameとfileNameはファイルオブジェクト
  • ○「case LinkStatus.LINK_MISSING」
    ×「case LINK_MISSING」

分からなかったこと

  • LINK_INACCESSIBLE
    「URL/画像のパスにアクセスできない」とはどんな状態?
    フォルダにパスワードがかかってるとか?
  • myDoc.filePathはフォルダ?ファイル?
    データブラウザを見ると[Folder]となっているが、オブジェクトモデルビューアで「filePath」を検索すると「Data Type : File」と記載されている。
  • documentのfullNameとfileNameの違い
  • 正規表現
    リンクのfilePathからフォルダ名だけを取得したかったのだけど、↓がうまいこといかなかった("C:\Users\aaa\Desktop\Link\a.psd"→"C:"みたいに最長一致になってしまった)。
myLinks[i].filePath.replace(/\\.+?$/,"")
 // "C:\Users\aaa\Link\a.psd" → "C:\Users\aaa\Link" にしたい

積み残し

  • LinkStatus.LINK_INACCESSIBLEのときのテストできてない
  • 毎度ながらやり口がスマートじゃない…リンクのパス(文字列)とフォルダオブジェクトを比較するやり方、もっとうまい方法がありそう。

参考