非エンジニアがGoogleAppScript（GAS）を社内で広めた方法

#はじめに
株式会社じげんの西尾です。
リフォームをはじめとする住環境に関するマッチングサービスで、マーケティング・セールスなどを行っています。

普段、業務をしていて、
毎朝KPIがBotでSlackにポストされ確認できたらいいなーと思ったことがありました。
そして、GoogleAppScript （以下GAS）を使うと対応出来ると聞いたので、
独学で試したらすぐに出来るようになりました。
また、GASが想像以上に便利＋（簡単な処理は非エンジニアでも）実装が難しくないため、
他のチームのメンバーに広めようと思いました。

最終的にGASがそれなりに広められたと思うのですが、
今回、GASを広めた際に注意していたことをまとめようと思います。
※作成したクエリは最後に記載しています。

#GASを広めるためにやったこと
##1.課題
何ができるかわからない
　∟GASを知らない or 知っているが使ったことがない人が大半
心理的ハードルが高い
　∟プログラミングが必要なため未経験者はとっつきにくい

##2.解決策
30分で終わるワークショップ形式で勉強会を実施
　∟すぐに実務で使えるテーマで実施（Slackにスプレッドシートの内容をポストする機能）
　∟基本コピペだけでできることを勉強会で強調
質問・練習用のSlackチャンネル作成・利用
　∟質問しやすい環境を作る（相談に対応してくださったエンジニアの皆さんには感謝です。）

##3.結果
この勉強会をきっかけにGASを独学で勉強する人が増えた！
参加者はその後にスプレッドシートを使ったKPIのモニタリングに留まらず、
SQL・Slack・Gmail等の各ツールを連携して業務効率化が出来た！

#まとめ
GASを広める際には着手する一番最初のハードルを下げることが重要です。
ハードルを下げるために、簡単にできるテーマ設定＋フォローが重要です。
クエリがきたなくても動けば一旦OK（タイミングを見てリファクタリング等は必要です。）
GASは便利なのでみんなで使いましょう！
実装したKPIをポストするbotは2019年9月に実装をし、2021年12月でも現役で動き続けていて、
日々のモニタリングで使えているのでいい取り組みだったと思います。

#作成したGAS
##Slackにポストした内容
![qiita用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274192/58b98144-4e09-9422-a608-e44297286f96.png)

##参考にした記事
【GAS×Slack】動的に更新されるスプレッドシートのKPIをGoogle Apps Scriptを使って、Slackに定期投稿する
https://sampling2x.com/2019/02/17/google-apps-script-slack-kpi-bot/
（作成者様に感謝です。）
※CV数等の各指標はスプレッドシートにあるGoogleAnalyticsのAPI × スプレッドシートの関数で抽出

##スクリプト
```javascript
function postSlack() {
  var obj = SpreadsheetApp.openById('スプレッドシートキー');

  var sheet = obj.getSheetByName("タブ名");

  //　シートのセルを指定した後、セルの内容を取得している
  var today = new Date(),
      year  = today.getFullYear(),
      month = today.getMonth(),
      day   = today.getDate()-1;
  var yesterday = new Date(year, month, day - 1);
  var values = sheet.getRange(3,2).getValue();
  var values1 = sheet.getRange(4,2).getValue();
  var values2 = sheet.getRange(5,2).getValue();
  var values3 = sheet.getRange(6,2).getValue();
  var values4 = sheet.getRange(7,2).getValue();
  var values5 = sheet.getRange(3,3).getValue();
  var values6 = sheet.getRange(4,3).getValue();
  var values7 = sheet.getRange(5,3).getValue();
  var values8 = sheet.getRange(6,3).getValue();
  var values9 = sheet.getRange(7,3).getValue();
  var values10 = Math.round(sheet.getRange(3,4).getValue() * 10000) / 100;
  var values11 = Math.round(sheet.getRange(4,4).getValue() * 10000) / 100;
  var values12 = Math.round(sheet.getRange(5,4).getValue() * 10000) / 100;
  var values13 = Math.round(sheet.getRange(6,4).getValue() * 10000) / 100;
  var values14 = Math.round(sheet.getRange(7,4).getValue() * 10000) / 100;
  var values15 = sheet.getRange(3,5).getValue();
  var values16 = sheet.getRange(4,5).getValue();
  var values17 = sheet.getRange(5,5).getValue();
  var values18 = sheet.getRange(6,5).getValue();
  var values19 = sheet.getRange(7,5).getValue();
  var values20 = sheet.getRange(3,6).getValue();
  var values21 = sheet.getRange(4,6).getValue();
  var values22 = sheet.getRange(5,6).getValue();
  var values23 = sheet.getRange(6,6).getValue();
  var values24 = sheet.getRange(7,6).getValue();
  var values25 = Math.round(sheet.getRange(3,7).getValue() * 10000) / 100;
  var values26 = Math.round(sheet.getRange(4,7).getValue() * 10000) / 100;
  var values27 = Math.round(sheet.getRange(5,7).getValue() * 10000) / 100;
  var values28 = Math.round(sheet.getRange(6,7).getValue() * 10000) / 100;
  var values29 = Math.round(sheet.getRange(7,7).getValue() * 10000) / 100;
  var values30 = sheet.getRange(3,8).getValue();
  var values31 = sheet.getRange(4,8).getValue();
  var values32 = sheet.getRange(5,8).getValue();
  var values33 = sheet.getRange(6,8).getValue();
  var values34 = sheet.getRange(7,8).getValue();
  var values35 = sheet.getRange(3,9).getValue();
  var values36 = sheet.getRange(4,9).getValue();
  var values37 = sheet.getRange(5,9).getValue();
  var values38 = sheet.getRange(6,9).getValue();
  var values39 = sheet.getRange(7,9).getValue();
  var values40 = Math.round(sheet.getRange(3,10).getValue() * 10000) / 100;
  var values41 = Math.round(sheet.getRange(4,10).getValue() * 10000) / 100;
  var values42 = Math.round(sheet.getRange(5,10).getValue() * 10000) / 100;
  var values43 = Math.round(sheet.getRange(6,10).getValue() * 10000) / 100;
  var values44 = Math.round(sheet.getRange(7,10).getValue() * 10000) / 100;
  
  //上記で取得したvalues変数（セルの内容）をSlackに綺麗に表示されるようにtext変数にする
  var text = ("項目：当日／前日／前々日／7日前／30日平均" + "\n" 
　　　　　　　　+ "ALL-SESS：" + values + "／" + values1 + "／" + values2 + "／" + values3 + "／" + values4 + "\n" 
　　　　　　　　+ "ALL-CV：" + values5 + "／" + values6 + "／" + values7 + "／" + values8 + "／" + values9  + "\n" 
　　　　　　　　+ "ALL-CVR：" + values10 +"%" + "／" + values11 +"%" + "／" + values12 +"%" + "／" + values13 +"%" + "／" + values14 +"%" + "\n" 
　　　　　　　　+ "Organic-SESS：" + values15 + "／" + values16 + "／" + values17 + "／" + values18 + "／" + values19 + "\n" 
　　　　　　　　+ "Organic-CV：" + values20 + "／" + values21 + "／" + values22 + "／" + values23 + "／" + values24  + "\n" 
　　　　　　　　+ "Organic-CVR：" + values25 +"%" + "／" + values26 +"%" + "／" + values27 +"%" + "／" + values28 +"%" + "／" + values29 +"%" + "\n" 
　　　　　　　　+ "Paid-SESS：" + values30 + "／" + values31 + "／" + values32 + "／" + values33 + "／" + values34 + "\n" 
　　　　　　　　+ "Paid-CV：" + values35 + "／" + values36 + "／" + values37 + "／" + values38 + "／" + values39  + "\n" 
　　　　　　　　+ "Paid-CVR：" + values40 +"%" + "／" + values41 +"%" + "／" + values42 +"%" + "／" + values43 +"%" + "／" + values44 +"%"+"\n"
　　　　　　　　+ "▼詳細"+ "\n"
　　　　　　　　+ "https://docs.google.com/spreadsheets/d/スプレッドシートで引用するURL");

  //データをJSON形式にする
  //名前（name）にtextを含む必要がある
  var payload = {
        "text": text,
  };
  
  //postオプションを指定
   var options = {
        "method": "POST",
        'headers': {'Content-type': 'application/json'},
        'payload' : JSON.stringify({
        'attachments':[
         {
          'color': '#3cb371',
          'title': '【サービス名_'+day+'日GAレポート】',
          'text': text,
         }
        ]
      })
  };


  // UrlFetchAppを使って、POSTする
    var url = "https://hooks.slack.com/services/XXX";
    UrlFetchApp.fetch(url, options);
};

```
（コードが汚いことはご容赦ください、、、）