LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.

More than 1 year has passed since last update.

posted at

updated at

鹿児島.mk #7 GASの体験ワークメモ

1 / 4

この記事は「鹿児島.mk #7 Google Apps Scriptのハンズオン」で使用する資料です。あらかじめご了承ください。

鹿児島.mk #7 Google Apps Scriptのハンズオン
https://kagoshima-mk.connpass.com/event/167038/

概要

Google Apps Scriptとは

Googleが提供しているJavaScriptをベースにするプログラミング言語です。ブラウザ上で実行でき、GoogleスプレッドシートやGoogleフォームと連携することで、特定の条件で自動的に処理(スプレッドシートに更新があったら通知, フォームに入力があれば自動でLINEを送る等)を実行することができます。

Google Apps Script
https://developers.google.com/apps-script

GASでできること

Googleアカウントに関することなら何でもできる!

  • Gmailを送る
  • Gmailの内容を取得する
  • Googleカレンダーに予定を登録・編集する
  • Googleスプレッドシートの編集
  • Jobを実行する
  • APIを叩いたり、APIを作る

つよつよなVBA!!

今回すること

  • Googleフォームに入力があったときにSlackに通知する
  • herokuを常時起動させる
  • WebAPIを作る
  • DB+WebAPIを作る
  • 外部APIから情報を取得してスプレッドシートに記録する

Googleフォームに入力があったときにSlackに通知する

Googleフォームの作成

以下と同じフォームを作成してください

フォームはこちらから作成できます。
https://docs.google.com/forms/u/0/

スクリーンショット 2020-02-26 9.42.22.jpg

サンプルコードの準備

フォームとスクリプトの紐付けを行います。
スクリーンショット 2020-02-26 8.46.34.jpg

webhookのURLはこちらで配布します
https://join.slack.com/t/kagoshima-mk/shared_invite/enQtNzMxNzc3NTQ4NDM5LTI4NGU3NjQzYjZjNjI3MDU3MWU2YmMxNGJjNzU0N2NkOTg3MGJhZGZjZDUwYTkzMGRmMGQ1ZDNiNTVlYmNmNTQ

自分でWebhook URLを取得したい方はこちらを参考にしてください

SlackのWebhook URL取得手順
https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

main.gs
var postChannel = "{チャンネル名}";
var url = "{webhook}";
// 好きな名前で大丈夫です
var userName = "{参加者名}";

function sendToSlack(body) {
  var data = { "channel" : postChannel, "username" : userName, "text" : body, "icon_emoji" : ":sushi:" };
  var payload = JSON.stringify(data);
  var options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : payload
  };
  var response = UrlFetchApp.fetch(url, options);
}

function test() {
 FormApp.getActiveForm();
  sendToSlack("テスト通知確認です");
}

function onFormSubmit(e){
  var body = "=============================="; 
  var applicant = "";
  var itemResponse = e.response ? e.response.getItemResponses(): [];

  var email = e.response ? e.response.getRespondentEmail(): 'test@hoge.com';
  var name = '名無し';
  var jobs = '無職';
  var age = '無回答';

  for (var j = 0; j < itemResponse.length; j++){    
    var formData = itemResponse[j];
    var title = formData.getItem().getTitle();
    var response = formData.getResponse();

    switch (title) {
      case "メールアドレス":
        email = response;
        break;
      case "お名前":
        name = response;
        break;
      case "所属":
        jobs = response;
        break;  
      case "年齢":
        age = response;
        break;
      default:
        break;
    }
  }
  var text =  body + " \nお名前:" + name + "\nメールアドレス: " + email + "\n職業:" + jobs + "\n年齢" + age + "\n\n==============================";
  sendToSlack(text);
}

課題

  1. フォームに項目を追加して、その項目と入力内容がSlackに通知されるようにしてください。
  2. Slackに投稿されるアイコンを寿司から別のものに変更してください(アイコンはicon_emojiで設定できます)

Qiita/Github/Slack/Discord 絵文字一覧
https://qiita.com/yamadashy/items/ae673f2bae8f1525b6af


(CI/CDチームはここまで)


先に進んだ人用

herokuを常時起動させる

【3分でできる】Herokuの無料プランでもスリープせずに高速化する方法【アドオン不要】
https://qiita.com/qst_exe/items/9770cadef420c04e1a84

WebAPIを作る

今から10分ではじめる Google Apps Script(GAS) で Web API公開
https://qiita.com/riversun/items/c924cfe70e16ee3fe3ba

DB+WebAPIを作る

Gasでgoogle Spreadsheetをjsonで返す方法
https://qiita.com/taichi0514/items/ee6dedff45f9d9e58ef4

外部APIから情報を取得してスプレッドシートに記録する

使用するスプレッドシート
https://docs.google.com/spreadsheets/d/13SuzxIuF6hw0vkteeTgpLFBGxpuX56rmRqmn3-IsY4E

main.gs
var ssId = '{スプレッドシートのID}';
var dbSheetName = '{DBとして使うシート名}';

//JSONのURL
var jsonUrl = "{APIのURL}";
var inputSheetName = "{データを書き込むシート名}";

// 以下の項目は編集しない
var spUrl = "https://docs.google.com/spreadsheets/d/"+ssId+"/";
var spreadsheet = SpreadsheetApp.openByUrl(spUrl);
var keys = {
  'title' : "",
  'started_at': "",
  'event_url' : "",
};

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('メニュー');
  menu.addItem('APIからJSON取得', 'getJson');
  menu.addToUi();
}

function getData(id, sheetName) {
  var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
  var rows = sheet.getDataRange().getValues();
  var keys = rows.splice(0, 1)[0];
  return rows.map(function(row) {
    var obj = {}
    row.map(function(item, index) {
      obj[keys[index]] = item;
    });
    return obj;
  });
}

function doGet(e) {
  var func = 'items';
  var data = getData(ssId, dbSheetName);
  return ContentService.createTextOutput(func + '(' + JSON.stringify(data, null, 2) + ')')
  .setMimeType(ContentService.MimeType.JAVASCRIPT);
}


function getJson() {
  var sheet = spreadsheet.getSheetByName(inputSheetName);
  var json = UrlFetchApp.fetch(jsonUrl).getContentText();
  var jsonData = JSON.parse(json);
  var eventData = jsonData.events;

  var k = 1;
  for(var key in keys) {
    sheet.getRange(1, k).setValue(key);  
    k++;
  }

  var i=2;
  for (var idx in eventData) {
    var j=1;
    for(var key in keys) {
      var type = typeof eventData[idx][key];
      sheet.getRange(i, j).setValue(eventData[idx][key]);  
      j++;
    }
    i++;
  }
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up