JavaScriptを記述していると複数のファイルで使いまわす関数や、あまりに長いコードの中で一部の処理を切り出して別ファイルに保存したい場合などがあります。
そういったときはオブジェクト(Key-Value)とreturnを使うと、他のファイルの関数を読み込んで、実行結果を受け取ることができます。
ここではその方法について解説しています。
別ファイルの関数の実行結果を使う方法
例えば、ステータス(status)とシート名(sheetName)を渡すと、処理を実行して該当するスプレッドシート(ss)とシート(sheet)、ID(ssid)を返してくれるコードは以下のようになります。
呼び出される関数
使いまわし用の呼び出される関数「ssRead」を作成します。
//「STG」か「本番」と「シート名」を渡す
function ssRead( { status, sheetName } ){
let ssid="";
if( status == "STG" ){
ssid = "STGの場合のスプレッドシートのID" //STG
}else if( status == "本番" ){
ssid = "本番の場合のスプレッドシートのID" //本番
}
let ss = SpreadsheetApp.openById(ssid);
let sheet = ss.getSheetByName(sheetName);
return { ss, sheet, ssid };
}
呼び出した結果を使う
次に、「getSheet」という関数の中で、上記の「ssRead」を呼び出し、その実行結果を使います。
function getSheet() {
let status = "STG"; //「STG」か「本番」を指定
let sheetName = "イベント一覧";
let res = ssRead( { status, sheetName } )
let ss = res["ss"]; //res.ssでもOK
let sheet = res["sheet"]; //res.sheetでもOK
let ssid = res["ssid"]; //res.ssidでもOK
console.log(Object.keys(res));
console.log(ssid);
}
このスクリプトの実行結果は以下になります。
[ 'ss', 'sheet', 'ssid' ]
本番の場合のスプレッドシートのID
呼び出した「ssRead」の実行結果を受け取れていることがわかります。
なお、Object.keys(変数)
というのは、引数に指定したオブジェクトのキーの値のみを返してくれるメソッドです。
コードの解説|呼び出される関数
まずは呼び出される関数「ssRead」から解説していきます。
//「STG」か「本番」と「シート名」を渡す
function ssRead( { status, sheetName } ){
let ssid="";
if( status == "STG" ){
ssid = "STGの場合のスプレッドシートのID" //STG
}else if( status == "本番" ){
ssid = "本番の場合のスプレッドシートのID" //本番
}
let ss = SpreadsheetApp.openById(ssid);
let sheet = ss.getSheetByName(sheetName);
return { ss, sheet, ssid };
}
オブジェクト形式 { }
コードはいろいろ書いてありますが、重要なのは引数の中の { } です。ここさえ押さえられれば特に難しいことはありません。
JavaScriptで { } を使って変数名を指定すると、オブジェクト(Key-Value)の形になります。
{ status }
↑↓ 同じ
{ status: status }
これは、キー名「status」、値が「status」という変数ということです。
複数指定した場合も同じです。
{ ss, sheet, ssid }
↑↓ 同じ
{ ss: ss, sheet: sheet, ssid: ssid }
戻り値 return
最後にこの関数が呼び出されたときに、実行結果を返すために「return」で渡す値を指定します。
return { ss, sheet, ssid };
このように指定することで、呼び出した先の関数には以下が返ります。
{ ss, sheet, ssid }
↑↓ 同じ
{ ss: ss, sheet: sheet, ssid: ssid }
コードの解説:関数を呼び出して、実行結果を取得する
次に、関数を呼び出して、実行結果を取得する処理は以下になります。
function getSheet() {
let status = "STG"; //「STG」か「本番」を指定
let sheetName = "イベント一覧";
let res = ssRead( { status, sheetName } )
let ss = res["ss"]; //res.ssでもOK
let sheet = res["sheet"]; //res.sheetでもOK
let ssid = res["ssid"]; //res.ssidでもOK
console.log(Object.keys(res));
console.log(ssid);
}
変数に格納する
1つめの重要なポイントは、呼び出した関数を変数に代入することです。
let res = ssRead( { status, sheetName } )
例えば、上記の場合ssRead関数を呼び出して、その実行結果を「res」という変数に入れています。(resはresponseの略です)
こうすることで、呼び出した関数の中のreturnで指定した実行結果が返り、以下のようになります。
res = { ss, sheet, ssid }
↑↓ 同じ
res = { ss: ss, sheet: sheet, ssid: ssid }
(参考)Object.keys
Object.keysは引数に渡したオブジェクトのすべてのキーの値を配列で返してくれるメソッドです。
変数resに対してObject.keysを実行すると、きちんとキーの値を取得することができます。
console.log(Object.keys(res));
↓ 実行結果
[ 'ss', 'sheet', 'ssid' ]
使いたい値を変数に代入する
実行結果を変数(res)に代入したままの状態では使い勝手が悪いので、それぞれ変数に代入します。
オブジェクト形式(Key-Value)のデータから値(Value)を取得するには オブジェクト[キー名]
とします。
または、オブジェクト.キー名
でも取得することができます。
オブジェクト["キー名"] //※文字列で指定
オブジェクト.キー名 //(ダブル)クオテーション不要
実例
let res = ssRead( { status, sheetName } )
let ss = res["ss"];
let sheet = res["sheet"];
let ssid = res["ssid"];
↑↓ 同じ
let res = ssRead( { status, sheetName } )
let ss = res.ss;
let sheet = res.sheet;
let ssid = res.ssid;
これで、呼び出した先の関数の中で「ss」「sheet」「ssid」という変数が使えるようになります。
以上で、別ファイルの関数を実行して、処理結果を受け取る方法は完了です。
NG例:呼び出した関数を変数に代入しない
呼び出した関数を変数に代入しないと、その実行結果を取得することはできません。
function getSheet() {
let status = "STG";
let sheetName = "イベント一覧";
ssRead( { status, sheetName } ) //関数の呼び出し
console.log(ssid);
}
↓ 実行結果
ReferenceError: ssid is not defined
ssRead関数ではreturn { ss, sheet, ssid };
を記述していますが、この関数を実行したからといって、呼び出し先の関数の中で変数「ss」「sheet」「ssid」が使えるようになるわけではありません。
変数に代入して、そこから欲しい値を取得するという処理が必要です。