GASで未承認伝票をslack通知する

未承認伝票をいちいち調べるのがめんどくさいので、slackで通知する機能が欲しくなりつくりました。

##背景
・経理でほぼ毎日伝票の承認をしている
・承認しないといけない伝票をいちいち会計システムに調べにいくのがめんどい
・たまに期日に追われる
##概要
おおきくわけると以下2つの処理に分かれる
#####①伝票データをRPAで毎朝会計システムから取得して、docsにコピー
・本当はAPIで会計システムから直接伝票データを取得したかったんだけど、IT部門に無理だと言われたのでRPAで対応
・RPA側ではとりあえず全データを取得(RPAは環境によっていろいろ違うと思うので割愛)して、docsに貼り付け（シート「支払い」）
#####②①で取得した伝票データをGASにて分類し、slack通知する
・スプレッドシートに各担当ごとの抽出条件を入力してもらい、その条件に従いGASで分類（シート「抽出設定」）
・slack通知はIncoming WebHooksを使う
・担当者の名前と通知先のurlをスプレッドシートに入力してもらう(シート「送付先設定」)

全体のコードは以下になります。
RPAにて会計システムからデータを取得できている前提です。（シート「支払い」に貼り付け済）

大まかにいうと
(1)「送付先設定」より、担当者の名前と送付先を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366075/ba1897dc-a524-d0b0-e104-efba7aa15856.png)

(2)その担当者の名前をキーに「抽出設定」からその担当者の抽出条件を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366075/fb2b808e-01df-e665-fe99-8b596c98af85.png)

(3)その抽出条件により、RPAが取得したデータを分類して(1)で取得した送付先に送る
以下、(1)～(3)を担当者ごとに繰り返す

```gas:sample.gs

  var username = '未承認教えるBOT';  // 通知時に表示されるユーザー名
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var datasheet = ss.getSheetByName('支払い');ここにRPAが伝票データを貼り付けてくれている
  var undone = "";ここにslack通知する内容をいれる

　function user()//シート送付先設定の行にある担当者ごとに、slack通知処理をおこなう・・・・・(1)
　{                        
   var to_userdata= SpreadsheetApp.getActiveSpreadsheet().getSheetByName('送付先設定').getDataRange().getValues();                   
　 for(var k = 1; k <to_userdata.length ; k++)
       {
        var user =to_userdata[k][0];
        var user_url = to_userdata[k][1];  
        send_user(user,user_url);  //一つ目のfunctionを実行している。担当者、送付先の値を渡して、データの送付をする                              
        }   
                                            
   //各担当者の抽出条件ごとに、支払いデータを抽出（make_undone）し、データを送付する
   function send_user(user,user_url) 
   {
    //抽出設定の抽出情報を配列として取得し、settingとする・・・・・(2)
    var setting = ss.getSheetByName('抽出設定').getDataRange().getValues();
    for(var k = 1; k <setting.length ; k++)
       {
         if(setting[k][2]==user)
           {
            var busho = setting[k][0];
            var comment = setting[k][1];
//二つ目のfunctionを実行している。抽出条件となる2つのパラメータを渡し、undoneデータを作成 
            make_undone(busho,comment,user_url);          
            }
        }   
    }         
 }             
//与えられたパラメータに従い、支払いデータから未処理データを抽出する・・・・・(3)
    function make_undone(busho,comment,user_url)
    { 
     var pdata = datasheet.getDataRange().getValues();//伝票データを配列pdataで取得 
     for(var i = 1; i < pdata.length; i++) 
         {
          if(pdata[i][5].indexOf(busho) !== -1 && pdata[i][15].indexOf(comment) !== -1)
                {
                  { 
                    undone += pdata[i][4]
                    //undoneデータをslack用のデータ形式に
                    var jsonData =
                          {
                            "username" : username,
                            "text" : undone
                          };
                        
                     var payload = JSON.stringify(jsonData);
                     var options =
                          {
                             "method" : "post",
                             "contentType" : "application/json",
                             "payload" : payload
                          };    

                     //undoneデータがあれば、指定のurlに送信
                        if(undone != "")
                          {
                            UrlFetchApp.fetch(user_url, options);
                          }   
                      //送付完了したらundoneの値をリセット
                      undone=""               
                  }
                }
     }
 }
```