Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GASでSlackBot
Search
takuaraki
August 22, 2018
Programming
1
550
GASでSlackBot
Google App Scriptsを利用して勤怠管理のSlackBotを作った話です。
takuaraki
August 22, 2018
Tweet
Share
More Decks by takuaraki
See All by takuaraki
2021/02/03 発覚の COCOA Android版 不具合について
takuaraki
0
60
Androidアプリ内課金のテスト
takuaraki
0
480
Material Design Guideline: Dialogs, Dividers
takuaraki
0
430
Material Design Guideline: Bottom components
takuaraki
0
530
App Shortcuts
takuaraki
0
380
[関モバ#18] SQLBrite&SQLDelight
takuaraki
0
490
A/B testing GTM&GA vs Firebase
takuaraki
1
2.9k
【関モバ#12】Google Tag ManagerでモバイルアプリのABテストをする
takuaraki
1
670
Other Decks in Programming
See All in Programming
New in Go 1.26 Implementing go fix in product development
sunecosuri
0
430
CSC307 Lecture 15
javiergs
PRO
0
240
Agent Skills Workshop - AIへの頼み方を仕組み化する
gotalab555
15
8.7k
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
140
grapheme_strrev関数が採択されました(あと雑感)
youkidearitai
PRO
1
220
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
420
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.1k
ロボットのための工場に灯りは要らない
watany
10
2.8k
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
110
今更考える「単一責任原則」 / Thinking about the Single Responsibility Principle
tooppoo
3
1.6k
Docコメントで始める簡単ガードレール
keisukeikeda
1
110
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
140
Featured
See All Featured
The Language of Interfaces
destraynor
162
26k
Become a Pro
speakerdeck
PRO
31
5.8k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
150
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
53k
4 Signs Your Business is Dying
shpigford
187
22k
Building AI with AI
inesmontani
PRO
1
790
Believing is Seeing
oripsolob
1
82
Building Flexible Design Systems
yeseniaperezcruz
330
40k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.4k
Typedesign – Prime Four
hannesfritz
42
3k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
250
Transcript
("4Ͱ4MBDL#PU ߥ !BSB@UBDL
"CPVU.F w ߥ !BSB@UBDL w '63:6$PSQ w "OESPJEͬͯ·͢ w
,PUMJOॻ͍ͯ·͢
࠷ۙͷۈଵཧ 4MBDLͰͬͯ·͢
͜Μͳײ͡
4MBDLͰͷۈଵཧ w ϝʔϧΑΓָͰྑ͍ײ͡ w ࠓɺ୭͕ٳΉͷ͔ḪΒͳ͍ͱ͔Βͳ͍ w ேྱͰಉ͡νʔϜͷਓ͕Θ͟Θ͟ใࠂͯͨ͠ ˠࠓɺٳΉਓ͕4MBDLͰ௨͞ΕͨΒ͍͍ͳʔ
,JOUBJ#PU࡞Γ·ͨ͠ OBNF OBNF OBNF OBNF
,JOUBJ#PU w 4MBDLͰͷɺΈΜͳͷۈଵൃݴΛه w ຖேɺͦͷͷରऀΛूܭ w ໊લೖྗຊจΛ·ͱΊͯߘ OBNF OBNF OBNF
OBNF
ͬͨͷ w 4MBDL0VUHPJOH8FC)PPLT w (PPHMF"QQT4DSJQU ("4 w (PPHMFεϓϨουγʔτ
0VUHPJOH8FC)PPLT w 4MBDLͷಛఆͷจࣈΛؚΉߘʹԠ͢Δ w ࢦఆͨ͠63-ʹ1045ϦΫΤετΛ͛Δ w ϦΫΤετύϥϝʔλ͕ߘϢʔβʔ໊ɺ ߘϝοηʔδͳͲΛؚΉ
(PPHMF"QQT4DSJQU w +BWBTDSJQUޓͷεΫϦϓτݴޠ w (PPHMFυΩϡϝϯτεϓϨουγʔτͳͲͷ (PPHMF"QQTΛૢ࡞Ͱ͖Δ w ࣌ؒ)551ϦΫΤετΛτϦΨʔʹͯ͠ ಈ͔͢͜ͱ͕Ͱ͖Δ
γεςϜߏ ("4 ۈଵه (PPHMF 4QSFBE 4IFFU ("4 ۈଵूܭ 0VUHPJOH 8FC)PPLT
ۈଵೖྗ ࠓͷۈଵʁ ूܭ݁Ռදࣔ 1045 ϦΫΤετ σʔλΛ ه σʔλΛ औಘ 1045 ϦΫΤετ ूܭ݁ՌΛ 4MBDLʹߘ
γεςϜߏ ("4 ۈଵه (PPHMF 4QSFBE 4IFFU ("4 ۈଵूܭ 0VUHPJOH 8FC)PPLT
ۈଵೖྗ ࠓͷۈଵʁ ूܭ݁Ռදࣔ 1045 ϦΫΤετ σʔλΛ ه σʔλΛ औಘ 1045 ϦΫΤετ ूܭ݁ՌΛ 4MBDLʹߘ
ۈଵهɿ4MBDL w ۈଵൃݴશһ΄΅ಉ͡ϑΥʔϚοτͩͬͨ ྫ ʲશٳʳʢਫʣࢲ༻ͷͨΊ w ʮʲʯΛτϦΨʔʹ0VUHPJOH8FC)PPLTͰ ه༻ͷ("4ʹ1045ϦΫΤετΛૹ৴ w 1045ϦΫΤετʹߘऀͱຊจ͕ࡌ͍ͬͯΔ
ۈଵهɿ("4 w 4MBDL͔Β1045ϦΫΤετΛड͚Δ w ຊจ͔Βਖ਼نදݱͰΛநग़͢Δ ͜ͷΛɺٳΉͱͯ͠ѻ͏ ྫ ʲશٳʳʢਫʣࢲ༻ͷͨΊˠ w ٳΉɺߘऀɺຊจΛεϓϨουγʔτʹه
ۈଵهɿ("4 function doPost(e) { // ରͷΛநग़ var pattern = /(?:\d{4}\/|)([1-9]|0[1-9]|1[0-2])\/([1-9]|0[1-9]|[12][0-9]|3[01])/;
var matchResult = e.parameter.text.match(pattern); var date = new Date().getFullYear() + "/" + matchResult[1] + "/" + matchResult[2]; // εϓϨουγʔτʹɺ໊લɺຊจΛه var sheet = getCurrentYearSpreadsheet().getSheets()[0]; var kintaiValues = sheet.getSheetValues(1, 1, maxRowCount, 3); var newLineRow = -1; for (var row = 0; row < 10000; row++) { var dateCell = kintaiValues[row][0]; if (dateCell == "") { newLineRow = row + 1; break; } } arrData = [ [date, e.parameter.user_name, e.parameter.text] ]; sheet.getRange(newLineRow, 1, 1, 3).setValues(arrData); }
%FNP ʮʲશٳʳʢਫʣࢲ༻ͷͨΊʯͱଧͬͯɺ εϓϨουγʔτʹՃ͞ΕΔͷΛݟͯΈΔ
γεςϜߏ ("4 ۈଵه (PPHMF 4QSFBE 4IFFU ("4 ۈଵूܭ 0VUHPJOH 8FC)PPLT
ۈଵೖྗ ࠓͷۈଵʁ ूܭ݁Ռදࣔ 1045 ϦΫΤετ σʔλΛ ه σʔλΛ औಘ 1045 ϦΫΤετ ूܭ݁ՌΛ 4MBDLʹߘ
γεςϜߏ ("4 ۈଵه (PPHMF 4QSFBE 4IFFU ("4 ۈଵूܭ 0VUHPJOH 8FC)PPLT
ۈଵೖྗ ࠓͷۈଵʁ ूܭ݁Ռදࣔ 1045 ϦΫΤετ σʔλΛ ه σʔλΛ औಘ 1045 ϦΫΤετ ूܭ݁ՌΛ 4MBDLʹߘ
ۈଵूܭɿ4MBDL w ࠓͷۈଵʁͱ͍͏4MBDLϦϚΠϯμʔΛ ࢝ۀͷલʹηοτ SFNJOE,JOUBJUPࠓͷۈଵʁBUFWFSZXFFLEBZ w ࠓͷۈଵʁΛτϦΨʔʹ0VUHPJOH8FC)PPL Ͱूܭ༻ͷ("4ʹ1045ϦΫΤετ
ۈଵूܭɿ("4 w ۈଵهͷεϓϨουγʔτΛಡΈࠐΉ σʔλɺߘऀɺຊจ w ݱࡏͱಉ͡ͷσʔλ͚ͩநग़ w நग़ͨ͠σʔλ͔Β4MBDLߘ༻ͷจΛ࡞ͯ͠ 4MBDLʹߘ͢Δ
ۈଵूܭɿ("4 function doPost(e) { var now = new Date(); var
slackMessage = "```\n”; var sheet = getCurrentYearSpreadsheet().getSheets()[0]; var kintaiValues = sheet.getSheetValues(1, 1, maxRowCount, 3); for (var row = 1; row < 10000; row++) { var date = kintaiValues[row][0]; if (date == "") { break; } // ݱࡏͱಉ͡σʔλ͚ͩநग़ͯ͠ɺߘ༻ϝοηʔδʹՃ if (date.getFullYear() == now.getFullYear() && date.getMonth() == now.getMonth() && date.getDate() == now.getDate()) { var name = kintaiValues[row][1]; var text = kintaiValues[row][2]; slackMessage += name + " " + text + "\n"; } } slackMessage += "```"; sendToSlack(slackMessage); }
%FNP ʮࠓͷۈଵʁʯͱଧͬͯɺ ूܭ݁Ռ͕ߘ͞ΕΔͷΛݟͯΈΔ
࡞ͬͨײ w (PPHMFυϥΠϒ্Ͱ݁ͨ͠ͷͰָͩͬͨ w (PPHMF"QQT4DSJQU໘ന͍ɻ͍Ζ͍ΖͰ͖ͦ͏ w #PUՄѪ͍ɻ༊͞ΕΔ ࡞ͬͯΈ͍͔͕ͯʁ
ࠓޙΓ͍ͨ͜ͱ w ՄѪ໊͍લͱΞΠίϯΛ͚͍ͭͨ w ʹόάΔ͜ͱ͕Θ͔͍ͬͯΔͷͰͳΜͱ͔͢Δ w ΑΓ៉ྷͳϑΥʔϚοτͰूܭΛߘ͢Δ w औΓফ͠ػೳΛ͚ͭΔ w
ϒϩάʹ·ͱΊΔ