検索
連載

「計算式エラーで残業確定……」、GASで入力データのチェックツールを作成働く価値を上げる“VBA/GAS術”(4)(4/4 ページ)

1つのGoogleスプレッドシートを複数人で共同編集するとき、想定していた形式とは違うデータを入力されると、不備が発生してしまう場合があります。そのような問題を、GASで解決するにはどうすればいいのでしょうか。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

if文で条件により分岐する

 関数「checkNumber」では、forブロック内で条件分岐処理を行っています。条件分岐処理とは言葉で表現すると「もし〜〜であれば……する」といった、条件に応じてその先の処理を変えるような処理のことをいいます。GASで条件分岐処理をする際には、以下書式によるif文という構文を使います。

if(条件式){
  //trueの場合に行う処理
}

 for文の説明でも出てきましたが、条件式は成立していれば「ture」、そうでなければ「false」の値を取ります。条件式がtrueであれば、波括弧の間(ifブロックといいます)の処理を実行するというものです。条件式がfalseであれば、ifブロックの処理は実行せずに飛ばします。例として、以下の関数testを実行して、if文の動作を確認してみましょう。

function test() {
  var sheet = SpreadsheetApp.getActiveSheet();
  if(sheet.getRange(2,3).getValue() >= 3){
    Logger.log('数量は3以上');
  }
}

 C2セルは「5」ですから、「5 >= 3」は成立、つまり条件式がtrueになります。従って、ログには「数量は3以上」と表示されます。

数値かどうかを判定する

 さて、今回作成している入力チェックツールは、C列数量、またはD列単価の値が数値かどうかを判定し、数値でなければそのセルの背景色を黄色に変更するというものでした。ですから、「数値かどうか」を判定する必要があります。

 GASで、指定の値が数値かどうかを判定するには「isFinite」関数を使います。書式は以下の通りで、与えられた値が有限の数値であればtrue、そうでなければfalseの値を取ります。

isFinite(値)

 例えば、下記関数testを実行してログを確認してみましょう。

function test() {
  var sheet = SpreadsheetApp.getActiveSheet();
  if(isFinite(sheet.getRange(2,3).getValue())){
    Logger.log('数値');
  }
}

 if文の条件式に、isFinite関数を使って、セルC2の値が数値かどうかを判定しています。セルC2の値は「5」で数値ですから、条件式はtrue。結果としてログには「数値」と出力されるはずです。getRangeメソッドの引数を「(3,3)」に変更して実行すると、ログには何も出力されなくなります。

条件式を反転させる

 しかし、今回は「数値であるかどうか」ではなくて、「数値でないかどうか」を判定する必要があります。つまり条件式が逆になります。そのような場合は、以下のように条件式に否定の論理演算子「!」を使用します。

!条件式

 条件式がtrueならば、!条件式はfalseに、条件式がfalseなら!条件式はtrueに、つまり条件式の真偽値を反転させることができます。では、以下関数testを実行してみましょう。

function test() {
  var sheet = SpreadsheetApp.getActiveSheet();
  if(!isFinite(sheet.getRange(3,3).getValue())){
    Logger.log('数値ではない');
  }
}

 C3セルは「3個」という値が入っていますから、数値ではありません。isFinite関数による結果はfalseですが、!演算子により反転しますので、ifブロックの処理が行われます。結果、ログには「数値ではない」と出力されます。getRangeメソッドの引数を「(2,3)」に戻して再度実行すると、ログには何も出力されません。

 関数checkNumberの条件式を確認してみましょう。以下の部分ですね。

if(!isFinite(sheet.getRange(i,3).getValue())){
  sheet.getRange(i,3).setBackground('yellow');
}

 まず、i行目、3列目のセルの値について「数値でない」のであればifブロック内を実行するという条件式になっていることが確認できます。

再度入力チェックツールのスクリプト全体を確認

 これで全ての命令について解説が完了となります。再度、関数checkNumberの内容を確認してみましょう。

function checkNumber() {
  var sheet = SpreadsheetApp.getActiveSheet();
  for(var i=2;i<=6;i++){
    if(!isFinite(sheet.getRange(i,3).getValue())){
      sheet.getRange(i,3).setBackground('yellow');
    }
    if(!isFinite(sheet.getRange(i,4).getValue())){
      sheet.getRange(i,4).setBackground('yellow');
    }
  }
}

次回はExcel VBAで「コピペ」をします

 GASでスプレッドシートのデータをチェックするスクリプトを解説してきました。for文、if文などの基本構文、シートやセルの操作など、GASの基本を学ぶことができますので、1つ1つのステートメントについて、理解することをお勧めします。

 次回は、Excel VBAを使って、データの転記つまり「コピペ」する便利ツールを作っていきます。どうぞお楽しみに。

著者プロフィール

高橋宣成

プランノーツ 代表取締役

「ITを活用して日本の『働く』の価値を高める」をテーマに、ExcelやVBA、G Suite、Google Apps Script、クラウドなどによる企業または個人事業主向けのシステムおよびツールの開発やコンサルティング、セミナー講師などを務める。「IT×働き方」をテーマに運営するブログ「いつも隣にITのお仕事」は月間47万PV達成。

書籍紹介

ExcelVBAを実務で使い倒す技術

高橋宣成著 秀和システム 1944円(税別)

動くコードが書けたその先、つまり「ExcelVBAを実務で使う」という目的に特化した実践書。ExcelVBAを楽に効果的に使いこなし続けるための知恵と知識、そしてそのためのビジョンと踏み出す勇気を提供する1冊。


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る