ishi14
@ishi14

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【GAS】日報承認システムのメール通知トリガーについて

解決したいこと

  • 簡易的な承認システムをGASでつくってます。
  • 承認者は「課長」「部長」の2段階で、それぞれ「承認」「棄却」をできるようにしたいです

前回別の質問で日付の表示についてご質問をし無事解決しました。

今回はもう少し基本に立ち返り、メール送信のトリガーについて改めてお伺いしたく存じます。

記述全体

function sendEmailByEvent() {
 
 //シート内の全データを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("確認シート");
  var data = sheet.getDataRange().getValues();
 
 //変更されたセルを取得、また、セルの行数を取得して配列に対応できるように-1した変数を設定
  var targetCell = sheet.getActiveCell();
  var targetCellRow = targetCell.getRow()-1;
 
 //メール送付先のアドレスとメール題名を設定
 
 //第1段階の課長承認関係
 //承認
  var recipient1c = "bucho@gmail.com", subject1t = "要作業|日報確認依頼(自動配信)"; //本番は部長アドレスにする 
 //棄却
  var recipient1a = "tantosha@gmail.com", subject1f = "要確認|課長日報棄却(自動配信)"; //本番は担当者アドレスにする

 //第2段階の部長承認関係
 //承認
  var recipient3a = "tantosha@gmail.com", subject3t = "部長最終承認のお知らせ(自動配信)"; //本番は担当者アドレスにする
  var recipient3b = "kacho@gmail.com", subject3t = "部長最終承認のお知らせ(自動配信)"; //本番は課長アドレスにする
 //棄却
  var recipient2a = "tantosha@gmail.com", subject2f = "要確認|部長日報棄却(自動配信)"; //本番は担当者アドレスにする
  var recipient2b = "kacho@gmail.com", subject2f = "要確認|部長日報棄却(自動配信)"; //本番は課長アドレスにする
 
 //メール本文用に、取得したセルの行データをbody配列にpushする
  var body = []
  body.push(data[targetCellRow])
 
  var datatitle = data[0];//タイトル行を取得
 
  body = '\― 本メールは自動配信メールです ―\n\n'
  body += '以下の通り日報が更新されました。\n\n'
  body += '詳細は次のスプレッドシートをご確認ください。\n'
  body += 'https://supredsheet~\n\n';
 
  datatitle.forEach((v, i) => body += " " + v + "" + (data[targetCellRow][i] //タイトル+取得した項目+改行をbodyに追加を繰り返し
  instanceof Date ? Utilities.formatDate(data[targetCellRow][i], Session.getScriptTimeZone(), "yyyy/MM/dd") : data[targetCellRow][i]) + "\n"); //日付表示形式をシンプルにする
 
 //今回のメイン。G行が提出かつH行とI行の文字列をみて判定し次のどちらかのメールを送付
 //第1段階の課長承認関係
if(targetCell.getColumn() === 8){ //8は8行目=H行のこと?
    if(data[targetCellRow][6] == "提出" && data[targetCellRow][7] ==="承認") //提出日(タイムスタンプ)とメールアドレスを除く[6]はH行/[7]はI行?
     GmailApp.sendEmail(recipient1c, subject1t, body)
    if(data[targetCellRow][6] == "提出" && data[targetCellRow][7] == "棄却") //提出日(タイムスタンプ)とメールアドレスを除く[6]はH行/[7]はI行
     GmailApp.sendEmail(recipient1a, subject1f, body)
  }
 
 ///第2段階の部長承認関係 
  if(targetCell.getColumn() === 9){ //9は9行目=I行のこと
    if(data[targetCellRow][7] == "承認" && data[targetCellRow][8] == "承認") //提出日(タイムスタンプ)とメールアドレスを除く[6]はH行/[8]はJ行
     GmailApp.sendEmail(recipient3a, subject3t, body)
     GmailApp.sendEmail(recipient3b, subject3t, body)
    if(data[targetCellRow][7] == "承認" && data[targetCellRow][8] == "棄却") //提出日(タイムスタンプ)とメールアドレスを除く[6]はH行/[8]はJ行
     GmailApp.sendEmail(recipient2a, subject2f, body)
     GmailApp.sendEmail(recipient2b, subject2f, body)
  }
 
}


うまくできていること

今回以下の通りスプレッドシートで記載しております。

A B C D E F G H I
Time Mail Date Name PDF Memo 判定条件1 判定条件2 判定条件3

「課長」承認段階である1段階目について詳細は以下の通りです。

G行の判定条件1には固定値で「提出」を入れております。
スプシ上でH行を「承認」にプルダウンから選び更新するとメールが次の承認者である部長に飛ぶようになっています。
「棄却」を選択すると「担当者」にメールで通知が飛ぶようになっています。

ここまではうまくできています。

発生している問題・エラー

問題が発生しているのは「部長」承認段階である2段階目になります。

部長が「承認」を選択すると、課長に「承認」「棄却」の2通メールが届きます。
一方部長が「棄却」を選択すると、課長にも本来「棄却」が届いて欲しいところ何も届かず、担当者にのみ「棄却」のメールが届きます。

2段階目のトリガー関係のソースを完全に理解できていないため対処法が分かりません。

いつも初歩的なご質問となり申し訳ありません。

何卒宜しくお願い致します。

0

1Answer

課長はH列、部長はI列で承認するかどうかを選択するということでしょうか?

問題が発生する原因としては、恐らくifの波かっこがないことです。
二行以上の文を書く場合は、波かっこを省略することはできません。

if (targetCell.getColumn() === 9) {
    // 8列目(H列)が承認である(つまり課長が承認している)
    // かつ9列目(I列)が承認である(つまり部長が承認している)
    if (data[targetCellRow][7] == "承認" && data[targetCellRow][8] == "承認")
    {
        GmailApp.sendEmail(recipient3a, subject3t, body)
        GmailApp.sendEmail(recipient3b, subject3t, body)
    }
        
    if (data[targetCellRow][7] == "承認" && data[targetCellRow][8] == "棄却")
    {
        GmailApp.sendEmail(recipient2a, subject2f, body)
        GmailApp.sendEmail(recipient2b, subject2f, body)
    }
}
1Like

Comments

  1. @ishi14

    Questioner

    @abiiii さま

    コメントいただき誠にありがとうございます。
    ご返信が遅くなってしまい申し訳ございません。
    無事、想定通りの挙動になりました。


    立て続けのご質問となり恐縮なのですが、
    スクリプト内に記載がある[9][7][8]の数字について
    理解をし切れていない箇所があります。

    第2段階の承認だと

    I列(9列目)までが対象範囲なので

    if (targetCell.getColumn() === 9)

    と記述するのは理解ができるのですが、その後の

    targetCellRow

    が[7][8]となるのはなぜなのでしょうか?

    単純に数えたらH行とI行なので

    if (data[targetCellRow][8] == "承認" && data[targetCellRow][9] == "承認")

    のように[8][9]となると思うのですがなぜこの場合[7][8]なのでしょうか?


    本当に初歩的なご質問をしてしまい申し訳ございません。
  2. 試していないのであくまで予想ですが、getColumnは1からカウントが始まる通常の文字の数え方と同じようになっていると思います。

    [targetCellRow][7][8]になる理由は、[]で指定するときは0からカウントが始まるからです。

    [0]は1行目、[1]は2行目を表します。

Your answer might help someone💌