This post is Private. Only a writer or those who know its URL can access this post.

Article information
Show article in Markdown
Report article
Help us understand the problem. What is going on with this article?

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

この記事は「鹿児島.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++;
  }
}
qst_exe
鹿児島でフルリモートのフリーランスエンジニアをしながら、YouTuberとしてプログラミングネタの発信、チームヒラマサでのプログラミング教育にも取り組んでいます。
https://bit.ly/2MegXIr
hiramasa-circle
プログラミング初学者を巻き込んでWebアプリを開発するエンジニアサークル
https://kusutan.com/hiramasa/344/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした