リンクをクリップボードにコピー
コピー完了
お世話になります。
任意のフォルダを選び、その中の第二階層に入っているaiデータだけを印刷するというスプリプトが欲しいと思っています。
私ができる範囲(超初心者)で、調べたり試したところ、第2階層だけを選ぶということがどうしてもできません。
ネットにあるのは、第一階層だけか、選択したフォルダ内のすべてのaiデータを選択すると言ったものです。
どうすれば、希望の階層だけを選ぶことができますでしょうか?
リンクをクリップボードにコピー
コピー完了
>私ができる範囲(超初心者)で、調べたり試したところ、第2階層だけを選ぶということがどうしてもできません。
そのできないスクリプトをここで見せた方が回答が付きやすくなりますよ。
リンクをクリップボードにコピー
コピー完了
ご回答いただき、ありがとうございます。
コードを書かなかったのは、自分で分かるレベルでトンチンカンなことをしている、となんとなく分かったからです。「for文を書いた後に、location? (「js フォルダ 階層」で検索すると出てくるんです)いや、違う気がする。そもそも、デスクトップ上のファイルの位置ってどうやって調べるの?中身全部とか、選んだフォルダだけとかはあるけれど、選んだフォルダの中の"ココ!"って指定するには?」と言うレベルです。恥ずかしすぎて…。
できる方からしたら、とんでもないことをしていると思います。
やはり、根本的にもっとjsを理解することから始めないと最短ではないのだなぁ、と詰まるたびに思い知らされます。
リンクをクリップボードにコピー
コピー完了
Ten Aさんのサンプルコードはよくできていて、とくに、
if (chld[i].toSource().indexOf("Folder")>=0)
この「フォルダかどうか」を判別するところが、重要なポイントになっています。
「フォルダの中のフォルダの中のaiファイルを取得」したいのなら、例えばこんな感じでしょうか。
var fdr = Folder.selectDialog("フォルダを選択");
//選択フォルダ内のアイテムを取得する
var chlds = fdr.getFiles();
//選択フォルダ内のアイテムをひとつずつ調べる
for (var i=0;i<chlds.length;i++)
{
//アイテムがフォルダなら
if (chlds[i].toSource().indexOf("Folder")>=0) {
//中のaiファイルを取得する
var aiFiles = chlds[i].getFiles("*.ai");
//aiファイルのフルパスを表示する
for (var j=0;j<aiFiles.length;j++)
{
alert(aiFiles[j].fsName);
}
}
}
リンクをクリップボードにコピー
コピー完了
基本的にフォルダにアクセスしたあとで子要素を取得してそれがフォルダならばそこに降りて再度子要素を取得しての繰り返しになります。
目印になるプロパティで決定的なものがなかったように思うのでtoSouceメソッドで見分ける方法で良いかと思います。
例えばデスクトップ上にあるフォルダやファイルを調べるには以下の様にFolderインスタンス以下にぶら下がる子をgetFilesメソッドで取得します。この子要素にはファイルとフォルダが入り乱れていますから総当りでチェックします。
var fdr = new Folder("~/Desktop");
var chld = fdr.getFiles();
tx = "";
for (var i=0;i<chld.length;i++)
{
if (chld[i].toSource().indexOf("Folder")>=0) tx += i+" : "+ chld[i].fsName + " : Folder" + "\n";
else tx += i+" : "+ chld[i].fsName + " : File" + "\n";
}
alert(tx)
これを参考に階層を掘り下げると良いでしょう。
リンクをクリップボードにコピー
コピー完了
ご回答いただき、ありがとうございます。
そしてコードまで書いていただき、ありがとうございます!
こちらと、ajabon grinsmith様に書いていただいた流れを元に、一つ一つ解読しながら、進めていきたいと思います。
ただ、「できた!」とご報告できるに至るまで、恐ろしく時間がかかると思います。
3日経ってご報告できるかどうか…(切ない)。
リンクをクリップボードにコピー
コピー完了
図版の雰囲気からしてMacユーザーと想像しますが、お使いの環境はなるべく記載しましょう。
任意のフォルダを選択、
その中からフォルダだけを選別(ループ)、
選別されたフォルダ群を順に調査(ループ)
フォルダの中を見る(二重ループ)、
aiなら出力する
という流れになりますね。
第二階層だけの決め打ちであればこれで十分です。
そうではなく、場面に応じて第何階層をやりたいか変化するようであれば、Ten Aさんの示された方式をもとに進めるのがよいかと思います。
こういった質問の場合、学習意欲がありヒントを欲しているのか、
学習意欲は薄く完成品を欲しているのかの明確化は必要かと思います。
前者の場合はとくに、monokanoさんの言われるとおりです。
リンクをクリップボードにコピー
コピー完了
ご回答いただき、ありがとうございます。
環境書き忘れ、失礼しました。
Mac10.13.6
IllustratorCC2020
の前後です(1つのパソコンで動かすわけではないので)。
>こういった質問の場合、学習意欲がありヒントを欲しているのか、
>学習意欲は薄く完成品を欲しているのかの明確化は必要かと思います。
正直言うと両方です。
正解があるならそれに越したことはない。
だけど、自分で書けるものなら書きたい。けれど、jsはなかなか理解できない。知らないこともいっぱいある。どう調べていいのかも分からない(何をどうしたらそうできるのか分からないから、しにくい。こうしたい!と思って調べてもそれがその機能であるとは限らなかったりする)。
たぶん、jsを学び始めた初心者すべてに共通するものだと思います。
ajabon grinsmith様とTen A様に教えていただいた方法で、試してみます。
流れを教えてくださってありがとうございました。これで、前に進めると思います(汗)。
ただ、「できた!」とご報告できるに至るまで、恐ろしく時間がかかると思います。
3日経ってご報告できるかどうか…(切ない)。
リンクをクリップボードにコピー
コピー完了
スレッドのタイトルにある「特定の階層にある」に取りかかる前に、第二階層の決め打ちで動かしてみるところから始めるといいと思います。
エラー回避とか入れてませんが最低限動いたものを置いておきますのでタシにしてもらえれば。
var folder = Folder.selectDialog ("フォルダえらぶ"); //フォルダをえらぶ
var folders = []; //第一階層にあったフォルダをためておく配列
var files = folder.getFiles();
for(var i = 0; i < files.length; i++){
if(files[i].constructor.name == "Folder"){
folders.push(files[i]);
}
}
var ais = []; //aiファイルをためるところ
for(i = 0; i < folders.length; i++){ //フォルダを順にやる
files = folders[i].getFiles();
for(var j = 0; j <files.length; j++){ //フォルダの中身を順にやる
if(files[j].fullName.match(/\.ai$/g)){ //拡張子を見る
ais.push(files[j]); //配列に追加
}
}
}
for(i = 0; i < ais.length; i++){
app.open(ais[i]); //開く
}
ただ、最終目標である「特定階層の〜」はこの延長線上にはありません。
でも、それ(特定階層)は書けるけどこれ(第二階層)は書けない、という人は絶対いないと思います。
じっくり進めていくのをおすすめします。
リンクをクリップボードにコピー
コピー完了
再びご回答いただき、ありがとうございます!
昨日も、試しては、エラーが起きるの繰り返しで、頭をリセットしてもう一度流れを確認しながら始めようと思っていたところです。
激励もありがとうございます。
ゆっくりではございますが、紐解きながら進めていきたいと思います。
頑張ります。