セミナー等の申し込みをGoogleフォームで受け付けておいて、セミナー受講料の支払方法(例えば振込やクレジット払い、ペイパル支払等)の区分ごとに、それぞれ文面が異なった自動返信メールを作成するような仕組みをGAS(GoogleAppsScript)で考えているんですが、その前段階として、Excelマクロで自分が頻繁に使う処理をGAS(GoogleAppsScript)でやる場合にはどのようにすればいいのかをまとめてみます。
スプレッドシートに記載された支払方法の種類によって表示結果を変えるGAS(GoogleAppsScript)
今回、スプレッドシートで下記のようなデータを準備しました。
このうち、C列に記載された「支払方法」の区分に応じて、E列にそれぞれ異なるメッセージを表示させるにはどういうスクリプトを作成すればよいか考えてみました。
で、こんな感じでスクリプトを考えてみました。↓
function myFunction() {
//■データの最終行を取得して、c列に記載された【支払方法】の区分によってE列に異なるメッセージを記載するスクリプト
//■変数宣言
let sheet = SpreadsheetApp.getActiveSheet(); //アクティブなスプレッドシートを取得する
let lastrow = sheet.getRange(sheet.getMaxRows(),1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); //A列の最終行を取得する
//■処理実行部分
sheet.getRange("e2:e5").setValue("");
for(let i=2;i<=lastrow;i++){
let name = sheet.getRange(i,2).getValue()
let MsgFurikomi = (` 【 ${name} 】様
FP独立セミナーへの申し込みありがとうございました。
受講料の振込はこちらの口座へお願いいたします。
なお支払期限までに振込が確認できない場合にはキャンセルとなりますのでご注意ください。`);
let MsgCredit =(` ${name}様
税理士廃業セミナーの申し込みありがとうございました。
クレジットの支払いはこちらのURLからお願いいたします。
なお支払期限までに振込が確認できない場合にはキャンセルとなりますのでご注意ください。`);
if(sheet.getRange(i,3).getValue()==="振込"){
sheet.getRange(i,5).setValue(MsgFurikomi);
}else if(sheet.getRange(i,3).getValue()==="クレジット"){
sheet.getRange(i,5).setValue(MsgCredit);
}else{
sheet.getRange(i,5).setValue("現金は対応しておりません。");
}
}
}
実行するとこんな感じで動きます↓
今回のスクリプトはまず、スプレッドシートに記載されたデータの最終行を取得し(今回は「5」を取得します)、そのデータの数だけ繰りかえしの処理をおこないます。
どのような繰りかえしの処理をおこなうかというと、C列に記載された文字を判定し、それが「振込」「クレジット」、それ以外かどうかを判定します。
その判定結果によってそれぞれ判定結果に対応した文章をE列に表示させます。
最終行の取得をGAS(GoogleAppsScript)でやるにはどうするか。Excelマクロとの比較も含めて。
GAS(GoogleAppsScript)で最終行を取得するにはこういう風にしないといけないようです。↓
let sheet = SpreadsheetApp.getActiveSheet(); //アクティブなスプレッドシートを取得する
let lastrow = sheet.getRange(sheet.getMaxRows(),1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); //A列の最終行を取得する
let sheet = SpreadsheetApp.getActiveSheet(); //アクティブなスプレッドシートを取得する。
この部分はどうやらアクティブになっているスプレッドシートを取得するテッパンのコードのようです。こういうのは理屈とか抜きにして「そんなもんなんだな。」って感じで覚える・慣れる方が早そうです。
Excelマクロの場合にはアクティブのシートは別に上記のように指定しなくて(指定したほうが丁寧ですが。)も自動で認識してくれますが、GASの場合には都度指定する必要がありそうです。(間違ってるかもしれませんが。)
で、最終行の取得方法は
.getRange(sheet.getMaxRows(),1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
こんな感じで記載するようです。これはExcelマクロでいうところの
cells(rows.count(),1,).end(xlup).row
と≒だと個人的には思っています。
GAS(GoogleAppsScript)でfor文をつかうにはどうするか、Excelマクロとの比較も含めて。
今回のケースの場合、GAS(GoogleAppsScript)で繰り返しの処理をおこなうための「for文」を使うにはこういう風にしないといけないようです。
for(let i=2;i<=lastrow;i++){
//ここに繰り返す処理を記載する。
}
Excelマクロの場合と考え方自体は一緒のような気がしますが、書き方が若干違っています。
GASの場合にはforの次にカッコを書き、その中に繰り返す条件なんかを指定していきます。「++」という表現方法はExcelマクロの場合には使ったことがありません。
Excelマクロのfor文はカッコを使用せずに、繰り返す処理の最後に「next i」 等と書くことが多いです。こんな感じで↓
dim i as long
dim lastrow as long
lastrow = cells(rows.count,1).end(xlup).row
for i = 2 to lastrow
//ここに繰り返したい処理を書く。
next i
Excelマクロの書き方からするとGASの書き方には違和感があるのが正直なところですが、これも慣れの問題でしょうね。
GAS(GoogleAppsScript)でif文を使うにはどうするかExcelマクロとの比較も含めて
GAS(GoogleAppsScript)でif文を使用するにはこういう風に記載するようです。
今回は複数条件の場合のif文の使い方を記載しておきます。
1つの条件だけを判定させるif文の場合にはもう少しシンプルな記載になります。
if(ここに判定させる一つ目の条件を記載する){
一つ目の条件に該当した場合の処理をここに記載する;
}else if(ここに判定させる二つ目の条件を記載する){
二つ目の条件に該当した場合の処理をここに記載する;
}else{
どの条件にも該当しなかった場合の処理をここに記載する。
}
こちらもExcelマクロの場合と考え方自体は一緒のような気がしますが、書き方が若干違っています。
for文の場合と一緒でGASの場合にはカッコを書き、その中に条件を記載します。
その後、条件に該当した場合の処理を{}の中に記載していきます。
今回の記事の場合にはこの箇所になります。
これに対してExcelマクロの場合にはカッコは特に使用しません。こんな感じで書きます↓
if ここに条件の一つ目を記載する then
条件の一つ目に該当した時の処理を記載する。
else if ここに条件の二つ目を記載する
条件の二つ目の該当した時の処理を記載する。
else
どの条件にも該当しなかった場合の処理を記載する。
end if
GAS(GoogleAppsScript)でセルの値を取得するにはどうするか
GAS(GoogleAppsScript)でセルに入力された値・データを取得するには
sheet.getRange(i,3).getValue()
などのようにgetrRange().getValue()を使うようです。
取得するので「get」を使うんでしょうね。このあたりは個人的には直感的でわかりやすく感じます。
Excelマクロの場合には下記のように記載するので、getは使わないのでGASの方が長く感じてしまいますが。
range(i,3).value
GAS(GoogleAppsScript)でセルに値を入力するにはどうするか
GAS(GoogleAppsScript)でセルにデータを入力するには
sheet.getRange(i,5).setValue()
などのようにgetrRange().setValue()を使うようです。
入力するので「set」を使うんでしょうね。このあたりもgetValueと同様、個人的に直感的でわかりやすく感じます。
まとめ
自分がExcelマクロでよくやる処理をGAS(GoogleAppsScript)で表現する場合にはどのように記述すればよいのかを比較しながらまとめてみました。
次回はこの記事を参考にしながら、Googleフォームの回答として受けとった、セミナー受講料の支払方法(例えば振込やクレジット払い、ペイパル支払等)の区分ごとに、それぞれ文面が異なった自動返信メールを作成するような仕組みを作ってみようと思います。
【本日の近況報告】
暖かく(暑く)なってきたのでアイスコーヒーを飲む機会が増えています。
コーヒーは基本無糖派で、近所のスーパーでアイスコーヒーを買ってきて飲んでるんですが、
銘柄はブレンディとネスカフェしかないんです。
ブレンディは牛乳と割ってカフェオレにするのが合うような、ネスカフェはそのままアイスコーヒーとして飲むのがあっているような気がします。(当社調べ)
ということで無糖派としてはネスカフェを手に取ることが多くなります。
【本日の1曲】
Wayne County & the Electric Chairs / Fuck Off