DTPab

DTPにまつわるあれこれ

DTPerのスクリプトもくもく会#16を開催しました

先週の1/25(土)、DTPerのスクリプトもくもく会#16を開催しました。
今回はけっこう広めのスペースを安く借りられたので、とても快適なもくもく会になりましたね。そのおかげもあってか、質問と情報共有と交流がほどほどに行われていて、主催としてはとても満足いくもくもく会になりました。記憶の限りになりますが、当日出た話をまとめてみます。

会場でもらった疑問・質問

ここのところ初心者らしいかたの参加が少ないので、あまり質問が出ないし、出てもその場で解決されてしまうことが多いですね^^;;
今回はこんな疑問・質問が出ました(漏れがあったら誰か補足してくれ〜)。

  • Excelから書き出すCSVファイルで、セル内改行があると"で括られる問題、みんなどうしてるの?
  • 外部ファイル(テキストファイル)の読み込み方法
  • 実行しているスクリプトファイル自身のファイルパス(同梱のファイルを読み込みたい)

ではそれぞれ補足していきます。

CSVファイルの"問題

Excelから書き出すCSVファイルで、セル内改行があると"で括られる問題、みんなどうしてるの?

これは技術でどうこうという話ではなさそう、という結論に。
僕はCSVファイルをエディタで開いて、タブ前後の"を検索し、元のデータ(原稿)と見比べて不要なものであれば削除する、という話をしました。
FileMakerに取り込んで出力するという話もありましたが、実際どうやるのがベストアンサーなんですかね。効率よく確実な方法があれば僕も知りたいです。

外部ファイル(テキストファイル)の読み込み

File.open()File.read()メソッドを使いますという話。
参加者のかたが回答してくださった、古籏さんのサイトが見やすいかも。
会のときに気づいたのですが、File.open()メソッドにa(append)モードがなかったのを古籏さんにご連絡して対応していただきました。

それはそれとして、外部ファイルを開いて読み込んで閉じるという一連の処理はよく使うので、モジュールとして用意しておくと何かと楽です。一応その例を下記に書いてみます。

function readFile(tgtFile) {
  //InDesign用 外部ファイルの読み込み
  if (tgtFile.constructor !== File) {
    throw TypeError("引数はFileオブジェクトを指定してください");
  }
  var res, flag;
  try {
    tgtFile.open("r");
    tgtFile.encoding = "UTF-8";
    res = tgtFile.read(); //Windowsの場合は引数を明示的に渡したほうがいいかも
    flag = true;
  } catch(e) {
    flag = false;
  } finally {
    tgtFile.close();
  }
  if (flag) {
    return res;
  } else {
    alert("ファイルが読み込めませんでした");
  }
}

使うときは別のスクリプトでこれを呼び出し(#include)ます。

//@include "~/desktop/readFile.jsxinc" //jsxincファイルとして読み込む

var myFile = File.openDialog("ファイルを選択してください", "*.txt");
var myContents = readFile(myFile);

File.open()メソッドの注意点としては下記の通り。

  • open()したら最後にかならずclose()すること
  • open()後にエラーが起きてclose()できないことがないように、try・catch文、できればfinally文も使って対処する
  • read()メソッドは、引数を指定しないとWindowsの場合にうまくいかないことがあった(ご自身の環境で試してみてください)
  • File.encodingプロパティはあってもなくても大抵は問題ないけど、念のため僕は記述することが多い

スクリプト自身へのパス(同階層のファイルを扱う)

正攻法

ヘルパーオブジェクト($)のプロパティにあります。
$.fileNameで、実行しているスクリプトのファイルパス(拡張子までのフルパス)をstring型で取得できます。僕はこれもよく使います。
例えばスクリプトファイルと同階層のconfig.jsonを読み込む方法です。

{"hoge": "ほげです", "fuga": 123}
//@include "~/desktop/readFile.jsxinc"

var folderPath = $.fileName.replace(/[^\/]+$/, "");
var configFile = File(folderPath + "config.json");
var myConfig = eval("("+readFile(configFile) + ")");
$.writeln(myConfig.hoge); //ほげです

ちなみに、ES3でもeval()メソッドを使うとJSONをパースできます。やりかたはコードのとおりです*1

includeしてもいい

読み込むファイル次第では、#includeでもいけます。

var myConfig = {"hoge": "ほげです", "fuga": 123};
#include "config.json"
$.writeln(myConfig.hoge); //ほげです

こうするとopen()だのread()だのclose()だのとやらなくて済みます。
ただ#includeも使いようです。過去の記事を参照ください。

uske-s.hatenablog.com

uske-s.hatenablog.com

その他情報

ScriptUI生成サービス

以前ツイートした、ScriptUIを生成するwebサービスを改めて紹介しました。
使い方はサイトを読んでくださいね(英語)。

scriptui.joonas.me

このサービスでいちばん気に入っているのは、pngファイルをスクリプトに埋め込めることです。SUIは自前で生成するとしても、その機能だけでも使いたいくらいw
あくまでもSUIの生成を手助けしてくれるだけです。各プロパティについては理解が必要なのでご注意を*2

VSCode Live Share

MD5500さんからご紹介いただいたVSCodeの拡張機能。

code.visualstudio.com

実際にMD5500さんと試してみたのですが、とてもおもしろかったです。
ハンズオンセミナーとかで使ってみたいですね。

Illustratorのバージョン調査方法

共同主催者であるこうちゃんがswiftで実装しようとして諦めてたけど、その話。

qiita.com

Illustratorのバージョン情報がファイルに保存されなくなるとか、そんな話がどこかで出てませんでしたっけ?(ものかのさんとお話した記憶がある)

さいごに

改めましてDTPerのスクリプトもくもく会にご参加くださったみなさま、ありがとうございました。
今回とても充実したもくもく会になって、主催としては嬉しい限りです*3

次回は3月の予定です。今度はちゃんと懇親会までやりたいな!
引き続き当会をよろしくお願いします。

記事補足

おりくらはじめ(@luci2)さんがツイートしてくださってました。

要するにApplication.activeScript.nameというプロパティで、現在実行しているスクリプトのファイル名が取得できるというもの。
ただし、実際のパスは確認したほうがいい、ということのようですね。情報ありがとうございます〜!

*1:JSON.stringify()はさすがに難しいw

*2:SUIを簡単に自動生成してくれるサービス、ではないということです。できあがったSUIのコードを利用してスクリプトに組み込んでいくのは自分です!

*3:自分はセミナーのスライド作ったりしてたけど…