ご訪問ありがとうございます。
Googleシートマスターのひろしです。
前回
【GAS】1行のデータを別シートにコピーし行を削除する方法
今回は、とっても価値の高い方法をお伝えします。
これを知ることであなたは、
- 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()
でも取得できます。
値のチェック
これは、力技で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スプレッドシート)
コピペで半角文字列を全角文字列に変換できる関数が作れます。