Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-26
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++;
  }
}
0

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
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?