先週の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
も使いようです。過去の記事を参照ください。
その他情報
ScriptUI生成サービス
以前ツイートした、ScriptUIを生成するwebサービスを改めて紹介しました。
使い方はサイトを読んでくださいね(英語)。
このサービスでいちばん気に入っているのは、pngファイルをスクリプトに埋め込めることです。SUIは自前で生成するとしても、その機能だけでも使いたいくらいw
あくまでもSUIの生成を手助けしてくれるだけです。各プロパティについては理解が必要なのでご注意を*2。
VSCode Live Share
MD5500さんからご紹介いただいたVSCodeの拡張機能。
実際にMD5500さんと試してみたのですが、とてもおもしろかったです。
ハンズオンセミナーとかで使ってみたいですね。
Illustratorのバージョン調査方法
共同主催者であるこうちゃんがswiftで実装しようとして諦めてたけど、その話。
Illustratorのバージョン情報がファイルに保存されなくなるとか、そんな話がどこかで出てませんでしたっけ?(ものかのさんとお話した記憶がある)
さいごに
改めましてDTPerのスクリプトもくもく会にご参加くださったみなさま、ありがとうございました。
今回とても充実したもくもく会になって、主催としては嬉しい限りです*3。
次回は3月の予定です。今度はちゃんと懇親会までやりたいな!
引き続き当会をよろしくお願いします。
記事補足
おりくらはじめ(@luci2)さんがツイートしてくださってました。
$.fileNameは『いま踏んだ「$.fileName」自体が書いてあるスクリプト』の名前を返し、https://t.co/FqQbEIhYbLは「最初に呼び出されたスクリプト」の名前を返すので、$.fileNameから表示内容を作ってる上側は左右で内容が変わるけど、https://t.co/FqQbEIhYbLを参照してる下側は同じ内容になる。
— おりくらはじめ@飴玉魔力 (@luci2) 2020年1月28日
あと、File(https://t.co/FqQbEIhYbL).fsNameとFile(app.activeScript.fullName).fsNameでは内容が違うことがある。File(https://t.co/FqQbEIhYbL).fsNameはDocuments\ディレクトリにスクリプトがあるって言ってるけどこれは嘘、という罠が(苦笑)。ちゃんと正しいパス返してるか確認した方がいい。
— おりくらはじめ@飴玉魔力 (@luci2) 2020年1月28日
要するにApplication.activeScript.name
というプロパティで、現在実行しているスクリプトのファイル名が取得できるというもの。
ただし、実際のパスは確認したほうがいい、ということのようですね。情報ありがとうございます〜!