Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
啓介 大橋
PPTX, PDF
16,380 views
パフォーマンスの良いGASの書き方 Best Practice
Atmosphere Tokyo 2014 Sandbox Session. gcp ja night × TokyoGAS Day2 GAS Session.
Technology
◦
Read more
20
Save
Share
Embed
Embed presentation
Download
Downloaded 35 times
1
/ 70
2
/ 70
3
/ 70
4
/ 70
5
/ 70
6
/ 70
7
/ 70
8
/ 70
9
/ 70
10
/ 70
11
/ 70
12
/ 70
13
/ 70
14
/ 70
Most read
15
/ 70
16
/ 70
17
/ 70
18
/ 70
19
/ 70
20
/ 70
21
/ 70
22
/ 70
23
/ 70
24
/ 70
25
/ 70
26
/ 70
27
/ 70
28
/ 70
29
/ 70
30
/ 70
31
/ 70
32
/ 70
33
/ 70
34
/ 70
35
/ 70
36
/ 70
37
/ 70
38
/ 70
39
/ 70
40
/ 70
41
/ 70
42
/ 70
43
/ 70
44
/ 70
45
/ 70
46
/ 70
47
/ 70
48
/ 70
49
/ 70
50
/ 70
51
/ 70
52
/ 70
53
/ 70
54
/ 70
55
/ 70
56
/ 70
57
/ 70
58
/ 70
59
/ 70
60
/ 70
61
/ 70
62
/ 70
63
/ 70
64
/ 70
65
/ 70
66
/ 70
67
/ 70
68
/ 70
69
/ 70
70
/ 70
More Related Content
ODP
SPAのルーティングの話
by
ushiboy
PPTX
アジャイルメトリクス実践ガイド
by
Hiroyuki Ito
PDF
なぜ「マイクロサービス“化”」が必要なのか
by
Yusuke Suzuki
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
by
Hiroshi Ito
PDF
ASP.NET CoreとAzure AD B2Cを使ったサクっと認証
by
Yuta Matsumura
PDF
私にとってのテスト
by
Takuto Wada
PDF
Rustに触れて私のPythonはどう変わったか
by
ShunsukeNakamura17
PDF
CSPO、CSM研修に参加して
by
Arata Fujimura
SPAのルーティングの話
by
ushiboy
アジャイルメトリクス実践ガイド
by
Hiroyuki Ito
なぜ「マイクロサービス“化”」が必要なのか
by
Yusuke Suzuki
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
by
Hiroshi Ito
ASP.NET CoreとAzure AD B2Cを使ったサクっと認証
by
Yuta Matsumura
私にとってのテスト
by
Takuto Wada
Rustに触れて私のPythonはどう変わったか
by
ShunsukeNakamura17
CSPO、CSM研修に参加して
by
Arata Fujimura
What's hot
PPTX
Apache ZooKeeper 로 분산 서버 만들기
by
iFunFactory Inc.
PPTX
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
by
なべ
PDF
アプリを成長させるためのログ取りとログ解析に必要なこと
by
Takao Sumitomo
PDF
分かったうえではじめるCI/CD
by
Yuta Matsumura
PDF
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
PPTX
実践!Django + GraphQL 実装
by
ssuseraf19bf
PPT
Chrome release cycle
by
Jolicloud
PPTX
APIテスト自動化とテストピラミッド
by
友隆 浅黄
PDF
RAPIDS 概要
by
NVIDIA Japan
PPTX
組み込みメーカーだからこそのAWS Cognitoの使い方
by
shotaueda3
PPTX
世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクス
by
Hiroyuki Ito
PDF
入門 シェル実装
by
Yusuke Sangenya
PDF
リーンスタートアップと顧客開発とアジャイル開発を一気通貫するッ #devlove #devkan
by
Itsuki Kuroda
PDF
会社でClojure使ってみて分かったこと
by
Recruit Technologies
PDF
.NET Core時代のCI/CD
by
Yuta Matsumura
PDF
BigQueryでJOINを極める!
by
Miki Katsuragi
PPTX
Akamai Intelligent Platform ご紹介
by
YuanChang21
PDF
Hello, DirectCompute
by
dasyprocta
PDF
DDDをScrumで廻す あるいは ScrumをDDDで廻す
by
Kiro Harada
PDF
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
by
株式会社MonotaRO Tech Team
Apache ZooKeeper 로 분산 서버 만들기
by
iFunFactory Inc.
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
by
なべ
アプリを成長させるためのログ取りとログ解析に必要なこと
by
Takao Sumitomo
分かったうえではじめるCI/CD
by
Yuta Matsumura
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
実践!Django + GraphQL 実装
by
ssuseraf19bf
Chrome release cycle
by
Jolicloud
APIテスト自動化とテストピラミッド
by
友隆 浅黄
RAPIDS 概要
by
NVIDIA Japan
組み込みメーカーだからこそのAWS Cognitoの使い方
by
shotaueda3
世界と事例から学ぶ、プロダクトオーナーの「素養」としてのアジャイルメトリクス
by
Hiroyuki Ito
入門 シェル実装
by
Yusuke Sangenya
リーンスタートアップと顧客開発とアジャイル開発を一気通貫するッ #devlove #devkan
by
Itsuki Kuroda
会社でClojure使ってみて分かったこと
by
Recruit Technologies
.NET Core時代のCI/CD
by
Yuta Matsumura
BigQueryでJOINを極める!
by
Miki Katsuragi
Akamai Intelligent Platform ご紹介
by
YuanChang21
Hello, DirectCompute
by
dasyprocta
DDDをScrumで廻す あるいは ScrumをDDDで廻す
by
Kiro Harada
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
by
株式会社MonotaRO Tech Team
Viewers also liked
PPTX
Google Apps Scriptとは? Add-onとは?
by
啓介 大橋
PPTX
Google Apps Script活用事例 Tokyo GAS 2013春
by
Junya Sato
PDF
Google apps scriptを使って業務改善
by
dcubeio
PDF
2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話
by
Humangas
PPTX
GCPUG Shonan GAS & GAE
by
啓介 大橋
PPTX
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
by
Yuki Katada
PDF
1019 まぁ!簡単!google apps script入門
by
Tatsuya Kosuge
PDF
Qualité de l'air et hygiène industrielle
by
Maxime Archaqmbault
PDF
18.3 Каталог решений - Гражданское строительство EKF
by
Igor Golovin
PPTX
Real estate – real fact 2
by
Biswajit Das. "Relationship Beyond Advising."
PPTX
Vyklikajte si obyvateľov na mape vo svojom okolí
by
Peter Fusek
PDF
Campamentos de verano Barbadillo 2017 BURGOS
by
Veleta3000
PDF
Campamentos de verano Molino de Butrera 2017 Burgos
by
Veleta3000
PDF
Campamento de Verano Imagina 2017 Bedmar Jaen
by
Veleta3000
PDF
Campamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOS
by
Veleta3000
PDF
TIM SA - podsumowanie 2016 roku
by
TIM SA
PDF
Xero in on your trade clients
by
Christian Newman (C.A.)
PDF
Checklist om je huwelijk tot in de puntjes te plannen
by
KBC Bank en Verzekeringen
PPTX
Junta Astorga 2017 03 28
by
Mauricio Lema
PDF
Campamentos de verano La Data 2017 Segovia
by
Veleta3000
Google Apps Scriptとは? Add-onとは?
by
啓介 大橋
Google Apps Script活用事例 Tokyo GAS 2013春
by
Junya Sato
Google apps scriptを使って業務改善
by
dcubeio
2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話
by
Humangas
GCPUG Shonan GAS & GAE
by
啓介 大橋
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
by
Yuki Katada
1019 まぁ!簡単!google apps script入門
by
Tatsuya Kosuge
Qualité de l'air et hygiène industrielle
by
Maxime Archaqmbault
18.3 Каталог решений - Гражданское строительство EKF
by
Igor Golovin
Real estate – real fact 2
by
Biswajit Das. "Relationship Beyond Advising."
Vyklikajte si obyvateľov na mape vo svojom okolí
by
Peter Fusek
Campamentos de verano Barbadillo 2017 BURGOS
by
Veleta3000
Campamentos de verano Molino de Butrera 2017 Burgos
by
Veleta3000
Campamento de Verano Imagina 2017 Bedmar Jaen
by
Veleta3000
Campamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOS
by
Veleta3000
TIM SA - podsumowanie 2016 roku
by
TIM SA
Xero in on your trade clients
by
Christian Newman (C.A.)
Checklist om je huwelijk tot in de puntjes te plannen
by
KBC Bank en Verzekeringen
Junta Astorga 2017 03 28
by
Mauricio Lema
Campamentos de verano La Data 2017 Segovia
by
Veleta3000
More from 啓介 大橋
PPTX
App Dojo 2017 12月 - VUI in your app with Dialogflow -
by
啓介 大橋
PPTX
Dockerハンズオン
by
啓介 大橋
PPTX
Fusion360 meetup vol2 LT
by
啓介 大橋
PPTX
gcp ja night #27 Google Cloud Endpoints with Golang
by
啓介 大橋
PPTX
Tokyo gas #5_whatsnewinappsscript_公開用
by
啓介 大橋
PPTX
Dart flightschool cloudendpoint with dart
by
啓介 大橋
App Dojo 2017 12月 - VUI in your app with Dialogflow -
by
啓介 大橋
Dockerハンズオン
by
啓介 大橋
Fusion360 meetup vol2 LT
by
啓介 大橋
gcp ja night #27 Google Cloud Endpoints with Golang
by
啓介 大橋
Tokyo gas #5_whatsnewinappsscript_公開用
by
啓介 大橋
Dart flightschool cloudendpoint with dart
by
啓介 大橋
パフォーマンスの良いGASの書き方 Best Practice
3.
しょっちゅう 「XXXってサイトにある、 このサンプルコードを コピーして使ってるのだけど、 うちの会社のデータ件数だと タイムアウトしちゃうんです。 どうにか助けて下さい」 って言われて、毎回同じ内容で返答していて、 流石に疲れてきたので ちゃんとパフォーマンスの話をするからお前ら聞 いてろ下さい
6.
何やってる?
8.
@soundTricker318 http://goo.gl/ZpUOs
9.
http://www.bfts.co.jp
11.
Contents うそ… 私のスクリプト 遅すぎ? パフォーマンス の良い書き方 まとめ Start End
12.
う そ ・ ・ ・ 私 の ス ク リ プ ト 遅 す ぎ ・ ・ ・ ? http://www.pakutaso.com/
13.
公式ドキュメントにも 有りますが…
14.
• GASは書き方によって非常にパフォーマンスが変 わります。 うそ…私の…
15.
質問
16.
GASを使ったことがある人? 質問
17.
GASでサンプルコードを コピーして 使ったことがある人? 質問
18.
GASでサンプルコードを コピーして 社内のシステムとして 使っている人? 質問
19.
GASでサンプルコードを コピーして 社内のシステムとして 使ってタイムアウトした人? 質問
20.
• 巷のサンプルコードは比較的パフォーマンスが 悪いコードを書いている – 公式ドキュメントに書いてある書き方を守ってな いことが多い •
https://developers.google.com/apps- script/best_practices?hl=ja – 多分読みやすくするためにそうしているのだと思い ます。 サンプルコード…
21.
• パフォーマンスが悪いコードを使うと… –処理が終わらなくてタイムアウトする –なんかGASで作るの嫌になる –GAS遅い…と言いふらすようになる –困る サンプルコード
22.
パ フ ォ ー マ ン ス の 良 いス ク リ プ ト で い い 感 じ に http://www.pakutaso.com/
23.
パフォーマンスの良い スクリプトの書き方
27.
• Spreadsheetに色つける処理 –データは100×100セル –セルに「hoge」と書いてあったら黄色に –ないなら無職 今回の処理
28.
以下のコードをSpreadsheet上のGASで実行すれば作れます。 今回の処理 var arr =
["hoge", "fuga", "foo", "bar" , "bus", "あいうえお", "かきくけこ"]; function make() { var grid = []; var header = []; for (var c = 0; c < 100; c++) { header.push(c + 1); } grid.push(header); for (var r = 1; r < 101; r++) { var row = []; for (var c = 0; c < 100; c++) { row.push(arr[Math.floor(Math.random() * arr.length)]); } grid.push(row); } SpreadsheetApp.getActiveSheet().getRange(1, 1, 101, 100).clear().setValues(grid); }
30.
function badCode() { var
spreadsheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqS ZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0"); for(var row = 2; row <= 101; row++) { for(var col = 1; col <= 100; col++) { var value = spreadsheet.getSheetByName("シート1").getRange(row, col).getValue(); if (value == "hoge") { spreadsheet.getSheetByName("シート1").getRange(row, col).setBackground("yellow"); } } } } 悪いコード
32.
function goodCode() { var
spreadsheet = SpreadsheetApp.openById("1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o"); var backgrounds = []; var sheet = spreadsheet.getSheetByName("シート1"); var targetRange = sheet.getRange(2, 1, 100, 100); var values = targetRange.getValues(); for(var rowIndex = 0; rowIndex < values.length; rowIndex++) { var row = values[rowIndex]; var backgroundRow = []; for(var colIndex = 0; colIndex < row.length; colIndex++) { var value = row[colIndex]; if (value == "hoge") { backgroundRow.push("yellow"); } else { backgroundRow.push(""); } } backgrounds.push(backgroundRow); } targetRange.setBackgrounds(backgrounds); } 良いコード
33.
①悪い部分を知る
34.
• 遅い理由を知らないとどこを直してよいかわか りません – 実行トランスクリプトを使ってどこに時間がかかっ ているか確認する ①悪い部分を知る
35.
①悪い部分を知る
36.
②無駄なAPIアクセス を減らす
37.
• GASのService呼び出しは全てネットワーク経由で行 われるため、時間がかかります。 少しでも無駄な呼び出しはしないようにします。 ②減らす ネットワーク経由
38.
function badCode() { var
spreadsheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqS ZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0"); for(var row = 2; row <= 101; row++) { for(var col = 1; col <= 100; col++) { var value = spreadsheet.getSheetByName("シート1").getRange(row, col).getValue(); if (value == "hoge") { spreadsheet.getSheetByName("シート1").getRange(row, col).setBackground("yellow"); } } } } ②減らす
39.
function badCode() { var
spreadsheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL- LEEqQK2n4yQO-o/edit#gid=0"); var sheet = spreadsheet.getSheetByName("シート1"); for(var row = 2; row <= 101; row++) { for(var col = 1; col <= 100; col++) { var range = sheet.getRange(row, col); var value = range.getValue(); if (value == "hoge") { range.setBackground("yellow"); } } } } ②減らす
40.
③なるべく1度にする
41.
• ②同じ原理でより呼び出し回数を減らすために getValues,setBackgrounds等のBatch Operationを 利用します。 ③1度にする 通常のgetValue() getValue() 1セルで1回アクセス
= 100×100回アクセス
42.
• ②同じ原理でより呼び出し回数を減らすために getValues,setBackgrounds等のBatch Operationを 利用します。 ③1度にする getValues() getValues) 100×100セルを1回アクセス
= 1回アクセス
43.
function badCode() { var
spreadsheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL- LEEqQK2n4yQO-o/edit#gid=0"); var sheet = spreadsheet.getSheetByName("シート1"); for(var row = 2; row <= 101; row++) { for(var col = 1; col <= 100; col++) { var range = sheet.getRange(row, col); var value = range.getValue(); if (value == "hoge") { range.setBackground("yellow"); } } } } ③1度にする
44.
function badCode() { var
spreadsheet = SpreadsheetApp .openByUrl("https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0"); var backgrounds = []; var sheet = spreadsheet.getSheetByName("シート1"); var targetRange = sheet.getRange(2, 1, 100, 100); var values = targetRange.getValues(); for(var rowIndex = 0; rowIndex < values.length; rowIndex++) { var row = values[rowIndex]; var backgroundRow = []; for(var colIndex = 0; colIndex < row.length; colIndex++) { var value = range.getValue(); if (value == "hoge") { backgrounds.push("yellow"); } else { backgrounds.push(“"); } } backgrounds.push(backgroundRow); } targetRange.setBackgrounds(backgrounds); } ③1度にする
45.
• 大体のスクリプトはこの②、③を実施すればかなりパ フォーマンスが良くなります。
46.
④ 我に返る
47.
• 今回の処理はGASでやる必要がありません。 Sheetsの標準機能でやれることはそっちでやりましょ う – 今回のはセルの条件付き書式でできます。 –
新しいSpreadsheetはかなり細かい書式が使えるので 確認して下さい。 ④我に返る
49.
openByIdとopenByUrl
50.
• Spreadsheet,Forms自体などを取得する際に利用す るopenByIdとopenByUrlというメソッドが有ります。 • これらは比較的openByIdの方が速い –
IDはURL中のなんかよくわかない文字の部分がだいたいそれ openByIdとUrl https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO- o/edit#gid=0
51.
UiApp
52.
• UiAppを利用するときはなるべくClientHandler等ク ライアントサイドで動くイベントハンドラを活用する – UiAppのイベントハンドラは上記以外は全てサーバコールに なりおっそい –
適切にClientHandlerを利用するとかなりUXがよくなる UiApp
53.
HtmlService
54.
• HtmlServiceのパフォーマンスを良くする書き方の話も公式 ページに乗っている HtmlService
55.
• 基本的には – データの取得は非同期に行う •
doGet内などHtmlService呼び出し前に行わない – <html>,<head>,<body>タグなどは利用しない • cajaにより自動的に<caja-v-html>に変えられるので意味が無い • 変えられる分時間がかかるので使わない – Javascriptは最後に読み込む • <script>タグはファイルの一番末尾に書いておく • そのほうが画面が表示されてからクライアントサイドのJavascriptが実行される HtmlService
56.
• 大橋の感覚として – 外部のJSやCSSは使わない方が良い •
使う場合は<script src=“xxx”>とはせず、<script>ここにコピペ</script>して、埋 め込んでしまう。 • cajaはGoogle経由で外部JS、CSSを取得するので遅い – 画面遷移はJavascriptを使って一部分だけ切り替える • doGetを毎回すると遅い • SPA(Single Page Application)の様にJSで画面を切り替えたほうが速い • というより画面切り替えはしないほうが良い HtmlService
57.
どうしても遅い
58.
• どうしても遅い時は… – UrlFetchAppを利用してGoogle
APIを直接呼び出す。 – 直接呼び出すと、欲しいデータが1回の操作で取得できる場 合がある • CalendarAppやDriveAppなどでよくある • fieldsパラメータを利用すると不要なデータを取得しない ためネットワーク的にも良い どうしても遅い
59.
• どうしても遅い時は… – 本当にリアルタイム(わざわざ人が待って)でやる必 要があるか考える •
Triggerを利用して遅延実行 & 通知でも良いのではない か? • 朝一回実行すれば大丈夫なんじゃないか? • 実行タイミングは定期的でも良いのじゃないか? どうしても遅い
60.
• どうしても遅い時は… – ちゃんとGASで作って良いのか考える –
金で解決できるのならGAEやGCPを使ったほうが良 い – SpreadsheetをDBとして使っている場合もそう • 大量のデータなら場合によってはFusion Table もっと多いならBigQueryを検討 どうしても遅い
62.
まとめ
63.
GASで 困ったら
64.
#gasja
65.
Google Apps API
Japan http://goo.gl/FcU0C
66.
@soundTricker318 http://goo.gl/ZpUOs
67.
会社: http://goo.gl/CfVPf 個人: http://goo.gl/kVTv3
Editor's Notes
#30
https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0
#32
https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0
#49
https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0
#62
https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0
Download