【GAS】プルダウンが変更された際に内容にしたがって処理する(onEdit)

応用

GAS応用の一覧

ご訪問ありがとうございます。

Googleシートマスターのひろしです。

前回

【GAS】1行のデータを別シートにコピーし行を削除する方法
  • GAS(JavaScript)での日付の比較方法がわかります。
  • 行の削除やデータのコピーする方法がわかります。
  • 今回は、とっても価値の高い方法をお伝えします。


    これを知ることであなたは、

    • GASで値を変更されたときに処理する方法がわかります。onEdit()
    • 値にしたがって処理を分ける方法がわかります。switch

    なので、サクッとマスターして

    というわけでやってみましょう。

    ご質問

     

    1.セルF2に「オプション3」が入力された。
    2.メールアドレス(B2宛て)にメールを送信される。
    3.メールの内容
    宛先は「aaa@bbb.com」。
    題名は本日の業務内容
    本文は『×××….』本文はセルC2~M7の中で入力した内容によって異なるものを送りたいです。
    「オプション1」をえらんだら『いろはにほへとちりぬるを』という本文のメールをおくる。
    「オプション2」をえらんだら『わかよたれそつねならむ』という本文のメールをおくる。
    「オプション3」をえらんだら『うゐのおくやまけふこえて』という本文のメールをおくりたいとおもっています。
    トリガー設定をします。スプレッドシートから変更時です。

     

     

    動画はこちら

    シートはこちら

    *クリックすることでシートが開きます。(コピーしてお使いください)

    スクリプト

    // プルダウンの選択でイベントが発生
    function onEdit(e) {
    
    
      const COL_MADDER = 2  //メールアドレスのカラム位置
      const ws = "シート1"
    
    
      if (e.source.getActiveSheet().getName() != ws) return
    
    
      // 変更された位置の取得
      let row = e.range.getRow()      //現在の行
      let col = e.range.getColumn()   //現在のカラム
    
    
      if ((row == 1) || col <= 2 || row >= 7) return
    
    
    
    
      // 変更された値の取得
      const val = e.source.getActiveSheet().getRange(row, col).getValue()
    
    
      const madder = e.source.getActiveSheet().getRange(row, COL_MADDER).getValue()
      const body = SetBody(val)
      e.source.getActiveSheet().getRange("F16").setValue(madder)
      e.source.getActiveSheet().getRange("F17").setValue(val)
      e.source.getActiveSheet().getRange("F18").setValue(body)
    
    
    
    
      // if (row >= 2 && col == 1 && e.source.getActiveSheet().getName() === ws) { //シートがwsでかつ1列目で2行目以降か?
      //   e.source.getActiveSheet().getRange(row, 4).setValue(currnetDate)
      //   if (e.source.getActiveSheet().getRange(row, 3).getValue() === "") { //Date Enterdが空のとき
      //     e.source.getActiveSheet().getRange(row, 3).setValue(currnetDate)  //Date Enterdに日時を入れる
      //   }
      // }
    
    
      MailApp.sendEmail(madder,"本日の業務内容",body)
    
    
    }
    
    
    // 変更された行のメアド(B列)の取得
    // 値にしたがって本文を設定する
    function test() {
      const sh = SpreadsheetApp.getActiveSheet()
      const val = sh.getRange("F3").getValue()
      console.log(val)
      let sendstr = SetBody(val)
      console.log(sendstr)
    
    
    
    }
    
    
    // 「オプション1」をえらんだら『いろはにほへとちりぬるを』という本文のメールをおくる。
    // 「オプション2」をえらんだら『わかよたれそつねならむ』という本文のメールをおくる。
    // 「オプション3」をえらんだら『うゐのおくやまけふこえて』という本文のメールをおくりたいとおもっています。
    
    
    function SetBody(str) {
      let sendstr = ""
      switch (str) {
        case "オプション 1":
          sendstr = "いろはにほへとちりぬるを"
          break
        case "オプション 2":
          sendstr = "わかよたれそつねならむ"
          break
        case "オプション3":
          sendstr = "うゐのおくやまけふこえて"
          break
      }
      return (sendstr)
    
    
    }

    ポイント

    スプレッドシートの変更時に処理する

    onEdit()を使います。

      let row = e.range.getRow()
      let col = e.range.getColumn()

    で編集された位置が取得できます。

    なので、あとはgetRangeすれば値が取得できます。

    e.source.getActiveSheet().getRange(row, col).getValue()

     

    値を取得するだけであれば

    e.range.getValue()

    でも取得できます。

     

    onEdit()には、スプレッドシートに対するすべてのイベントが飛んでくるので
    関係ないイベントはすぐに返すようにしてください。

     

     

    値のチェック

    これは、力技でif文連発でもいいのですが、3つ以上選択肢がある場合は、
    switchを使いましょう。

    例)

    switch (str) {
        case "オプション 1":
          sendstr = "いろはにほへとちりぬるを"
          break
        case "オプション 2":
          sendstr = "わかよたれそつねならむ"
          break
        case "オプション3":
          sendstr = "うゐのおくやまけふこえて"
          break
      }

    の構文になります。

     

    —追記—

    添字に”オプション 1″を指定するようなやり方があったと
    思っていたのですが、わかりました。

    連想配列なるものを使うのです。

     

    SetBody関数がこんなにスッキリします。

    function SetBody(str) {
    
    
      let BodyArray = {}
      BodyArray["オプション 1"] = "いろはにほへとちりぬるを"
      BodyArray["オプション 2"] = "わかよたれそつねならむ"
      BodyArray["オプション3"] = "うゐのおくやまけふこえて"
     
      return(BodyArray[str])
    
    
    }

     

     

     

    メール配信
      MailApp.sendEmail( メールアドレス,題名,本文)

    となります。

    ただし、onEdit()内からメールを送ることはできません。

    代替案は動画内で紹介しています。

    今後時間があれば対応します。

     

     

    最後までご覧いただきありがとうございます。

    つぎはこちら

    【GAS】半角文字列を全角文字列に変換する方法(ExcelのJIS関数) (Gスプレッドシート)
    コピペで半角文字列を全角文字列に変換できる関数が作れます。

    GAS応用の一覧

    コメント

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