Practice makes Perfect !

ExtendedScript素人です。同じ境遇の方、一緒に脱素人を目指しましょう!

関数と引数

関数の目的

スクリプトの勉強を始めたころは本当にこの関数が分かりづらく、「もうやめようかな…」て何度か考えたものでした。
しかし、特に難しく考える必要はなかったようで、単に「まとまった処理を行う機能」が関数であると考えればよさそうだと思うようになりました。

そもそも関数の目的は、

  • プログラムを短くする
  • 再利用する


ということになるそうです。
プログラムが短くなることの利点は「ミスが減ること」。
再利用することの利点は「プログラムを作成する手間が省けること」。

たしかに、見た目がすっきりしてて、きれいだな~って思うスクリプトって関数が上手に使ってあることが多いのではないかと思います。


さて、実は私、この関数に引数が入ってくるとよくわからなかったのです…。
そして今でも理解が怪しい!


ここはやっぱりJavascriptの基礎から調べるべきかと思ってJavascriptに関するサイトを見てみまして…
www.javadrive.jp

簡単な例なら、なんとなくわかったような気がしました。

例えば、

function ID(name, age){
alert(name+"は"+age+"才です");
}

//関数IDを呼び出して、引数nameにやすちん、ageに42を渡す
ID("やすちん", 42);

こんな感じで、実行結果は「やすちんは42才です」と表示されます。
こんな例でも引数を変えるだけで何度も使えるので、やはり便利です。

return文

関数は処理した結果を返す機能を持っていて、関数内にreturn文を記述することで任意の値を返すことができます。

function multiply(num1, num2){
return num1*num2;
}
alert(multiply(5, 10));

これの実行結果は50と表示されます。

さきほどの名前と年齢の例でreturnを使うと…

function ID(name, age){
return name+"は"+age+"才です";
}

//実行結果を変数に入れてみる
var result =ID("やすちん", 42);
alert(result);

これでも上記とおなじ結果になります。


こうやってゆっくり調べてみるとなんとなくわかったような気がます。
そこでちょっとこの関数と引数を使って「開いているすべてのドキュメントに「背景」という名のレイヤーを最背面に作るスクリプト」を書くとこんな感じでどうかなと思います。

for (counter=0; counter<app.documents.length; counter++){
	addLayer(counter); 
	//下記のaddLayerという関数を呼び出す
	}

//addLayerという関数を定義し、引数に変数Noを設定。
//Noに上記"counter"の値が渡される
function addLayer(No){
var doc = app.documents[No];

//「背景」という名のレイヤーを作成し、最背面へ移動
var layObj = doc.layers.add({name:"背景"});
var lay_B = doc.layers.lastItem();
layObj.move(LocationOptions.AFTER, lay_B);
}


「背景」という名のレイヤーをもともと持つドキュメントが出てきた時の処理は…。いちおう載せてはおきますが、本当は中止するのではなく、「問題のドキュメントをすっ飛ばして処理を続ける」ってやりたかったんです。
でも残念なことに、勉強不足で分かりませんでした。
continueを使えばよさそうな気はするんですが…。
この程度です(涙)

for (counter=0; counter<app.documents.length; counter++){
	addLayer(counter);
	}

function addLayer(No){
var doc = app.documents[No];

//もともと"背景"という名のレイヤーがあったら処理を中止する
for (var i=0; i<doc.layers.length; i++){
	if(doc.layers[i].name=="背景"){
		alert(doc.name+"には\r背景というレイヤーが既に存在します。\r処理を中止します");
		exit();
	}		
}		
var layObj = doc.layers.add({name:"背景"});
var lay_B = doc.layers.lastItem();
layObj.move(LocationOptions.AFTER, lay_B);
}


よく内容を理解していないのにブログを書いてしまう素人ですが、どうぞご容赦くださいませ。


さて、今わたしが、これはいいな!って思っているのはUske_Sさんのサイトにあるmyerrorの使い方。

var myerror = function (mes){
    alert(mes);
    exit();
    }

そしてアラートメッセージを呼び出すには次のように書くだけ。こういうのシンプルで読みやすくて素敵です。

myerror("エラーメッセージ");

uske-s.hatenablog.com