7-3■Openイベントを設定してみよう!

第7章 電卓を作ってみよう!

前回、クリアボタンでデフォルト状態を定義しました。

クリアボタンを押せばデフォルトになるようになりましたが、このままでは使うたびに最初にクリアボタンを押す必要がでてきます。

せめて、スプレッドシートを開いた時にはデフォルト状態になってほしい。

 

開いたときコードを実行する。

これをOpenイベントといいます。

function名をonOpenとすると、スプレッドシート起動時に勝手に読み込んでくれます。

その代わり、読み込みが終わるまでスプレッドシートが動かないので、あまり重くすると開くのに時間がかかるので注意しましょう。

 

では、早速。

スプレッドシートを開いたら、デフォルト状態になるようにする。

デフォルト状態はクリアボタンと同じだからコピーすれば大丈夫ですね。

function onOpen() {

var spreadsheet = SpreadsheetApp.getActive();

var currentCell = spreadsheet.getCurrentCell();

var sheet = spreadsheet.getActiveSheet();

/*すべてのセルデータを削除*/

sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();

spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});

/*1行目にテキストを代入*/

sheet.getRange(“A1”).setValue(“計算画面”);

sheet.getRange(“B1”).setValue(“ロック”);

sheet.getRange(“C1”).setValue(“ストック値”);

sheet.getRange(“D1”).setValue(“計算式”);

/*A2セルに0を代入*/

sheet.getRange(‘A2’).setValue(0);

/*B2セルに0を代入*/

sheet.getRange(‘B2’).setValue(0);

};

さあ、出来ました。

では、いったんスプレッドシートを閉じて開きなおしてみましょう。

うまくいきましたか?

 

でも、このコードって全く同じことを別の名前で2回書いてるだけですよね?

だったら、うまくまとめられないものでしょうか?

コードは長く書けば書くほど処理が重くなります。

出来る限り単純化して、処理を軽くしましょう。

 

まずは宣言文のvarのところ、共通してるから先にまとめてあげちゃいましょう。

ついでにこの後、必要になる共通の宣言文を書いちゃいましょう。

/*共通する宣言文を事前にまとめる*/

spreadsheet = SpreadsheetApp.getActive();

sheet = spreadsheet.getActiveSheet();

A2 = sheet.getRange(“A2”).getValue();

B2 = sheet.getRange(“B2”).getValue();

C2 = sheet.getRange(“C2”).getValue();

D2 = sheet.getRange(“D2”).getValue();

宣言のみなので、functionなしでこれだけ一番上に書いておきましょう。

これで、これ以降のコードではこの表現は全て短縮出来ますね。

 

ということで、button_clear内を整理しましょう。

と、ついでにマクロのコピーで入っていた

var currentCell = spreadsheet.getCurrentCell();

のところですが、どう見てもどこにもかかってないので消してしまいましょう。

function button_clear() {

/*すべてのセルデータを削除*/

sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();

spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});

/*1行目にテキストを代入*/

sheet.getRange(“A1”).setValue(“計算画面”);

sheet.getRange(“B1”).setValue(“ロック”);

sheet.getRange(“C1”).setValue(“ストック値”);

sheet.getRange(“D1”).setValue(“計算式”);

/*A2セルに0を代入*/

sheet.getRange(‘A2’).setValue(0);

/*B2セルに0を代入*/

sheet.getRange(‘B2’).setValue(0);

}

宣言を消してまとめただけですが、これで少しは軽くなりました。

そして、ここからが今回やりたかった本当のこと。

 

どうせ、onOpenでやりたいことはbutton_clearと同じことなんだから、簡単に書きたい!

/*open時にクリアを実行*/

function onOpen() {

button_clear();

}

すっごくすっきりしましたね。

こうやって書けば、他のfunctionを呼び出して実行することが出来ます。

繰り返し行う処理などはこうやって一つのfunctionをまとめてしまうとスッキリします。

重要なテクニックなので覚えておきましょう。

 

ということで、ただの繰り返しになっちゃいますが、ここで全部のコードを書いておくので確認してください。

宣言、起動時、クリアボタンの3つ分の割にはスッキリしたコードになったかと思います。

/*共通する宣言文を事前にまとめる*/

spreadsheet = SpreadsheetApp.getActive();

sheet = spreadsheet.getActiveSheet();

A2 = sheet.getRange(“A2”).getValue();

B2 = sheet.getRange(“B2”).getValue();

C2 = sheet.getRange(“C2”).getValue();

D2 = sheet.getRange(“D2”).getValue();

/*open時にクリアを実行*/

function onOpen() {

button_clear();

}

function button_clear() {

/*すべてのセルデータを削除*/

sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();

spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});

/*1行目にテキストを代入*/

sheet.getRange(“A1”).setValue(“計算画面”);

sheet.getRange(“B1”).setValue(“ロック”);

sheet.getRange(“C1”).setValue(“ストック値”);

sheet.getRange(“D1”).setValue(“計算式”);

/*A2セルに0を代入*/

sheet.getRange(‘A2’).setValue(0);

/*B2セルに0を代入*/

sheet.getRange(‘B2’).setValue(0);

}

コメント

タイトルとURLをコピーしました