SlideShare a Scribd company logo
1 of 70
しょっちゅう
「XXXってサイトにある、
このサンプルコードを
コピーして使ってるのだけど、
うちの会社のデータ件数だと
タイムアウトしちゃうんです。
どうにか助けて下さい」
って言われて、毎回同じ内容で返答していて、
流石に疲れてきたので
ちゃんとパフォーマンスの話をするからお前ら聞
いてろ下さい
何やってる?
@soundTricker318
http://goo.gl/ZpUOs
http://www.bfts.co.jp
Contents
うそ…
私のスクリプト
遅すぎ?
パフォーマンス
の良い書き方 まとめ
Start End
う
そ
・
・
・
私
の
ス
ク
リ
プ
ト
遅
す
ぎ
・
・
・
?
http://www.pakutaso.com/
公式ドキュメントにも
有りますが…
• GASは書き方によって非常にパフォーマンスが変
わります。
うそ…私の…
質問
GASを使ったことがある人?
質問
GASでサンプルコードを
コピーして
使ったことがある人?
質問
GASでサンプルコードを
コピーして
社内のシステムとして
使っている人?
質問
GASでサンプルコードを
コピーして
社内のシステムとして
使ってタイムアウトした人?
質問
• 巷のサンプルコードは比較的パフォーマンスが
悪いコードを書いている
– 公式ドキュメントに書いてある書き方を守ってな
いことが多い
• https://developers.google.com/apps-
script/best_practices?hl=ja
– 多分読みやすくするためにそうしているのだと思い
ます。
サンプルコード…
• パフォーマンスが悪いコードを使うと…
–処理が終わらなくてタイムアウトする
–なんかGASで作るの嫌になる
–GAS遅い…と言いふらすようになる
–困る
サンプルコード
パ
フ
ォ
ー
マ
ン
ス
の
良
いス
ク
リ
プ
ト
で
い
い
感
じ
に
http://www.pakutaso.com/
パフォーマンスの良い
スクリプトの書き方
• Spreadsheetに色つける処理
–データは100×100セル
–セルに「hoge」と書いてあったら黄色に
–ないなら無職
今回の処理
以下のコードを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);
}
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");
}
}
}
}
悪いコード
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);
}
良いコード
①悪い部分を知る
• 遅い理由を知らないとどこを直してよいかわか
りません
– 実行トランスクリプトを使ってどこに時間がかかっ
ているか確認する
①悪い部分を知る
①悪い部分を知る
②無駄なAPIアクセス
を減らす
• GASのService呼び出しは全てネットワーク経由で行
われるため、時間がかかります。
少しでも無駄な呼び出しはしないようにします。
②減らす
ネットワーク経由
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");
}
}
}
}
②減らす
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度にする
• ②同じ原理でより呼び出し回数を減らすために
getValues,setBackgrounds等のBatch Operationを
利用します。
③1度にする
通常のgetValue()
getValue()
1セルで1回アクセス = 100×100回アクセス
• ②同じ原理でより呼び出し回数を減らすために
getValues,setBackgrounds等のBatch Operationを
利用します。
③1度にする
getValues()
getValues)
100×100セルを1回アクセス = 1回アクセス
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度にする
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度にする
• 大体のスクリプトはこの②、③を実施すればかなりパ
フォーマンスが良くなります。
④ 我に返る
• 今回の処理はGASでやる必要がありません。
Sheetsの標準機能でやれることはそっちでやりましょ
う
– 今回のはセルの条件付き書式でできます。
– 新しいSpreadsheetはかなり細かい書式が使えるので
確認して下さい。
④我に返る
openByIdとopenByUrl
• Spreadsheet,Forms自体などを取得する際に利用す
るopenByIdとopenByUrlというメソッドが有ります。
• これらは比較的openByIdの方が速い
– IDはURL中のなんかよくわかない文字の部分がだいたいそれ
openByIdとUrl
https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-
o/edit#gid=0
UiApp
• UiAppを利用するときはなるべくClientHandler等ク
ライアントサイドで動くイベントハンドラを活用する
– UiAppのイベントハンドラは上記以外は全てサーバコールに
なりおっそい
– 適切にClientHandlerを利用するとかなりUXがよくなる
UiApp
HtmlService
• HtmlServiceのパフォーマンスを良くする書き方の話も公式
ページに乗っている
HtmlService
• 基本的には
– データの取得は非同期に行う
• doGet内などHtmlService呼び出し前に行わない
– <html>,<head>,<body>タグなどは利用しない
• cajaにより自動的に<caja-v-html>に変えられるので意味が無い
• 変えられる分時間がかかるので使わない
– Javascriptは最後に読み込む
• <script>タグはファイルの一番末尾に書いておく
• そのほうが画面が表示されてからクライアントサイドのJavascriptが実行される
HtmlService
• 大橋の感覚として
– 外部のJSやCSSは使わない方が良い
• 使う場合は<script src=“xxx”>とはせず、<script>ここにコピペ</script>して、埋
め込んでしまう。
• cajaはGoogle経由で外部JS、CSSを取得するので遅い
– 画面遷移はJavascriptを使って一部分だけ切り替える
• doGetを毎回すると遅い
• SPA(Single Page Application)の様にJSで画面を切り替えたほうが速い
• というより画面切り替えはしないほうが良い
HtmlService
どうしても遅い
• どうしても遅い時は…
– UrlFetchAppを利用してGoogle APIを直接呼び出す。
– 直接呼び出すと、欲しいデータが1回の操作で取得できる場
合がある
• CalendarAppやDriveAppなどでよくある
• fieldsパラメータを利用すると不要なデータを取得しない
ためネットワーク的にも良い
どうしても遅い
• どうしても遅い時は…
– 本当にリアルタイム(わざわざ人が待って)でやる必
要があるか考える
• Triggerを利用して遅延実行 & 通知でも良いのではない
か?
• 朝一回実行すれば大丈夫なんじゃないか?
• 実行タイミングは定期的でも良いのじゃないか?
どうしても遅い
• どうしても遅い時は…
– ちゃんとGASで作って良いのか考える
– 金で解決できるのならGAEやGCPを使ったほうが良
い
– SpreadsheetをDBとして使っている場合もそう
• 大量のデータなら場合によってはFusion Table
もっと多いならBigQueryを検討
どうしても遅い
まとめ
GASで
困ったら
#gasja
Google Apps API Japan
http://goo.gl/FcU0C
@soundTricker318
http://goo.gl/ZpUOs
会社: http://goo.gl/CfVPf
個人: http://goo.gl/kVTv3
パフォーマンスの良いGASの書き方 Best Practice
パフォーマンスの良いGASの書き方 Best Practice
パフォーマンスの良いGASの書き方 Best Practice

More Related Content

What's hot

Use After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試すUse After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試すmonochrojazz
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」U-dai Yokoyama
 
正しいものを正しくつくる
正しいものを正しくつくる正しいものを正しくつくる
正しいものを正しくつくるtoshihiro ichitani
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
AWS Black Belt Online Seminar 2018 AWS上の位置情報
AWS Black Belt Online Seminar 2018 AWS上の位置情報AWS Black Belt Online Seminar 2018 AWS上の位置情報
AWS Black Belt Online Seminar 2018 AWS上の位置情報Amazon Web Services Japan
 
セキュリティを楽しむ(CTFとbugbountyの始め方)
セキュリティを楽しむ(CTFとbugbountyの始め方)セキュリティを楽しむ(CTFとbugbountyの始め方)
セキュリティを楽しむ(CTFとbugbountyの始め方)kazkiti
 
標的型攻撃からどのように身を守るのか
標的型攻撃からどのように身を守るのか標的型攻撃からどのように身を守るのか
標的型攻撃からどのように身を守るのかabend_cve_9999_0001
 
体系的に学ばないXSSの話
体系的に学ばないXSSの話体系的に学ばないXSSの話
体系的に学ばないXSSの話Yutaka Maehira
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかAtsushi Nakada
 
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 152016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15歩 柴田
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay都元ダイスケ Miyamoto
 
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021whywaita
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解都元ダイスケ Miyamoto
 
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方Hiroshi Tokumaru
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
IoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache FlinkIoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache FlinkTakanori Suzuki
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門Tadahiro Ishisaka
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜Takahiro Inoue
 
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説UnityTechnologiesJapan002
 
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)Toru Makabe
 

What's hot (20)

Use After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試すUse After Free 脆弱性攻撃を試す
Use After Free 脆弱性攻撃を試す
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
 
正しいものを正しくつくる
正しいものを正しくつくる正しいものを正しくつくる
正しいものを正しくつくる
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
AWS Black Belt Online Seminar 2018 AWS上の位置情報
AWS Black Belt Online Seminar 2018 AWS上の位置情報AWS Black Belt Online Seminar 2018 AWS上の位置情報
AWS Black Belt Online Seminar 2018 AWS上の位置情報
 
セキュリティを楽しむ(CTFとbugbountyの始め方)
セキュリティを楽しむ(CTFとbugbountyの始め方)セキュリティを楽しむ(CTFとbugbountyの始め方)
セキュリティを楽しむ(CTFとbugbountyの始め方)
 
標的型攻撃からどのように身を守るのか
標的型攻撃からどのように身を守るのか標的型攻撃からどのように身を守るのか
標的型攻撃からどのように身を守るのか
 
体系的に学ばないXSSの話
体系的に学ばないXSSの話体系的に学ばないXSSの話
体系的に学ばないXSSの話
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 152016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
 
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDayマイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
マイクロサービス時代の認証と認可 - AWS Dev Day Tokyo 2018 #AWSDevDay
 
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
 
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方
SSRF対策としてAmazonから発表されたIMDSv2の効果と破り方
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
IoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache FlinkIoT時代におけるストリームデータ処理と急成長の Apache Flink
IoT時代におけるストリームデータ処理と急成長の Apache Flink
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
 
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
【Unite Tokyo 2019】3Dアバターファイルフォーマット「VRM」詳説
 
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)
 

Viewers also liked

Google Apps Scriptとは? Add-onとは?
Google Apps Scriptとは? Add-onとは?Google Apps Scriptとは? Add-onとは?
Google Apps Scriptとは? Add-onとは?啓介 大橋
 
Google Apps Script活用事例 Tokyo GAS 2013春
Google Apps Script活用事例 Tokyo GAS 2013春Google Apps Script活用事例 Tokyo GAS 2013春
Google Apps Script活用事例 Tokyo GAS 2013春Junya Sato
 
Google apps scriptを使って業務改善
Google apps scriptを使って業務改善Google apps scriptを使って業務改善
Google apps scriptを使って業務改善dcubeio
 
2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話
2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話
2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話Humangas
 
GCPUG Shonan GAS & GAE
GCPUG Shonan GAS & GAEGCPUG Shonan GAS & GAE
GCPUG Shonan GAS & GAE啓介 大橋
 
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -Yuki Katada
 
1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門Tatsuya Kosuge
 
Qualité de l'air et hygiène industrielle
Qualité de l'air et hygiène industrielleQualité de l'air et hygiène industrielle
Qualité de l'air et hygiène industrielleMaxime Archaqmbault
 
18.3 Каталог решений - Гражданское строительство EKF
18.3 Каталог решений - Гражданское строительство EKF18.3 Каталог решений - Гражданское строительство EKF
18.3 Каталог решений - Гражданское строительство EKFIgor Golovin
 
Vyklikajte si obyvateľov na mape vo svojom okolí
Vyklikajte si obyvateľov na mape vo svojom okolíVyklikajte si obyvateľov na mape vo svojom okolí
Vyklikajte si obyvateľov na mape vo svojom okolíPeter Fusek
 
Campamentos de verano Barbadillo 2017 BURGOS
Campamentos de verano Barbadillo 2017 BURGOSCampamentos de verano Barbadillo 2017 BURGOS
Campamentos de verano Barbadillo 2017 BURGOSVeleta3000
 
Campamentos de verano Molino de Butrera 2017 Burgos
Campamentos de verano Molino de Butrera 2017 BurgosCampamentos de verano Molino de Butrera 2017 Burgos
Campamentos de verano Molino de Butrera 2017 BurgosVeleta3000
 
Campamento de Verano Imagina 2017 Bedmar Jaen
Campamento de Verano Imagina 2017 Bedmar JaenCampamento de Verano Imagina 2017 Bedmar Jaen
Campamento de Verano Imagina 2017 Bedmar JaenVeleta3000
 
Campamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOS
Campamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOSCampamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOS
Campamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOSVeleta3000
 
TIM SA - podsumowanie 2016 roku
TIM SA - podsumowanie 2016 rokuTIM SA - podsumowanie 2016 roku
TIM SA - podsumowanie 2016 rokuTIM SA
 
Checklist om je huwelijk tot in de puntjes te plannen
Checklist om je huwelijk tot in de puntjes te plannenChecklist om je huwelijk tot in de puntjes te plannen
Checklist om je huwelijk tot in de puntjes te plannenKBC Bank en Verzekeringen
 
Junta Astorga 2017 03 28
Junta Astorga 2017 03 28Junta Astorga 2017 03 28
Junta Astorga 2017 03 28Mauricio Lema
 
Campamentos de verano La Data 2017 Segovia
Campamentos de verano La Data 2017 SegoviaCampamentos de verano La Data 2017 Segovia
Campamentos de verano La Data 2017 SegoviaVeleta3000
 

Viewers also liked (20)

Google Apps Scriptとは? Add-onとは?
Google Apps Scriptとは? Add-onとは?Google Apps Scriptとは? Add-onとは?
Google Apps Scriptとは? Add-onとは?
 
Google Apps Script活用事例 Tokyo GAS 2013春
Google Apps Script活用事例 Tokyo GAS 2013春Google Apps Script活用事例 Tokyo GAS 2013春
Google Apps Script活用事例 Tokyo GAS 2013春
 
Google apps scriptを使って業務改善
Google apps scriptを使って業務改善Google apps scriptを使って業務改善
Google apps scriptを使って業務改善
 
2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話
2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話
2014-02-20_Tokyo-GAS#5-社内活性化推進にGASを大活用した話
 
GCPUG Shonan GAS & GAE
GCPUG Shonan GAS & GAEGCPUG Shonan GAS & GAE
GCPUG Shonan GAS & GAE
 
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
 
1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門1019 まぁ!簡単!google apps script入門
1019 まぁ!簡単!google apps script入門
 
Qualité de l'air et hygiène industrielle
Qualité de l'air et hygiène industrielleQualité de l'air et hygiène industrielle
Qualité de l'air et hygiène industrielle
 
18.3 Каталог решений - Гражданское строительство EKF
18.3 Каталог решений - Гражданское строительство EKF18.3 Каталог решений - Гражданское строительство EKF
18.3 Каталог решений - Гражданское строительство EKF
 
Real estate – real fact 2
Real estate – real fact 2Real estate – real fact 2
Real estate – real fact 2
 
Vyklikajte si obyvateľov na mape vo svojom okolí
Vyklikajte si obyvateľov na mape vo svojom okolíVyklikajte si obyvateľov na mape vo svojom okolí
Vyklikajte si obyvateľov na mape vo svojom okolí
 
Campamentos de verano Barbadillo 2017 BURGOS
Campamentos de verano Barbadillo 2017 BURGOSCampamentos de verano Barbadillo 2017 BURGOS
Campamentos de verano Barbadillo 2017 BURGOS
 
Campamentos de verano Molino de Butrera 2017 Burgos
Campamentos de verano Molino de Butrera 2017 BurgosCampamentos de verano Molino de Butrera 2017 Burgos
Campamentos de verano Molino de Butrera 2017 Burgos
 
Campamento de Verano Imagina 2017 Bedmar Jaen
Campamento de Verano Imagina 2017 Bedmar JaenCampamento de Verano Imagina 2017 Bedmar Jaen
Campamento de Verano Imagina 2017 Bedmar Jaen
 
Campamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOS
Campamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOSCampamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOS
Campamentos de verano Molino de Butrera inmersion INGLES 2017 BURGOS
 
TIM SA - podsumowanie 2016 roku
TIM SA - podsumowanie 2016 rokuTIM SA - podsumowanie 2016 roku
TIM SA - podsumowanie 2016 roku
 
Xero in on your trade clients
Xero in on your trade clientsXero in on your trade clients
Xero in on your trade clients
 
Checklist om je huwelijk tot in de puntjes te plannen
Checklist om je huwelijk tot in de puntjes te plannenChecklist om je huwelijk tot in de puntjes te plannen
Checklist om je huwelijk tot in de puntjes te plannen
 
Junta Astorga 2017 03 28
Junta Astorga 2017 03 28Junta Astorga 2017 03 28
Junta Astorga 2017 03 28
 
Campamentos de verano La Data 2017 Segovia
Campamentos de verano La Data 2017 SegoviaCampamentos de verano La Data 2017 Segovia
Campamentos de verano La Data 2017 Segovia
 

Similar to パフォーマンスの良いGASの書き方 Best Practice

SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までMasahiro Wakame
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 TokyoYoshiyuki Asaba
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門spring_raining
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
Favtile ~never write JS again~
Favtile ~never write JS again~Favtile ~never write JS again~
Favtile ~never write JS again~hanachin
 
リーダブルコード 第二章
リーダブルコード 第二章リーダブルコード 第二章
リーダブルコード 第二章Yuto Ogi
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会Nao Minami
 
20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsqlToshi Harada
 
Groovyで学ぶプロセス代数 #jjug
Groovyで学ぶプロセス代数 #jjugGroovyで学ぶプロセス代数 #jjug
Groovyで学ぶプロセス代数 #jjugkyon mm
 
Enumはデキる子 ~ case .Success(let value): ~
 Enumはデキる子 ~ case .Success(let value): ~ Enumはデキる子 ~ case .Success(let value): ~
Enumはデキる子 ~ case .Success(let value): ~Takaaki Tanaka
 
ライブラリにあらず! 〜Google Closure Toolsの事始め〜
ライブラリにあらず! 〜Google Closure Toolsの事始め〜ライブラリにあらず! 〜Google Closure Toolsの事始め〜
ライブラリにあらず! 〜Google Closure Toolsの事始め〜Kazuya Hiruma
 
フロント作業の効率化
フロント作業の効率化フロント作業の効率化
フロント作業の効率化Yuto Yoshinari
 
PostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQLPostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQLNoriyoshi Shinoda
 
Chugoku db 17th-postgresql-9.6
Chugoku db 17th-postgresql-9.6Chugoku db 17th-postgresql-9.6
Chugoku db 17th-postgresql-9.6Toshi Harada
 

Similar to パフォーマンスの良いGASの書き方 Best Practice (20)

Tokyo r33 beginner
Tokyo r33 beginnerTokyo r33 beginner
Tokyo r33 beginner
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Aizu lt tokyo_luxion
Aizu lt tokyo_luxionAizu lt tokyo_luxion
Aizu lt tokyo_luxion
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 
Favtile ~never write JS again~
Favtile ~never write JS again~Favtile ~never write JS again~
Favtile ~never write JS again~
 
リーダブルコード 第二章
リーダブルコード 第二章リーダブルコード 第二章
リーダブルコード 第二章
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会
 
20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
Groovyで学ぶプロセス代数 #jjug
Groovyで学ぶプロセス代数 #jjugGroovyで学ぶプロセス代数 #jjug
Groovyで学ぶプロセス代数 #jjug
 
Enumはデキる子 ~ case .Success(let value): ~
 Enumはデキる子 ~ case .Success(let value): ~ Enumはデキる子 ~ case .Success(let value): ~
Enumはデキる子 ~ case .Success(let value): ~
 
ライブラリにあらず! 〜Google Closure Toolsの事始め〜
ライブラリにあらず! 〜Google Closure Toolsの事始め〜ライブラリにあらず! 〜Google Closure Toolsの事始め〜
ライブラリにあらず! 〜Google Closure Toolsの事始め〜
 
フロント作業の効率化
フロント作業の効率化フロント作業の効率化
フロント作業の効率化
 
PostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQLPostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQL
 
Chugoku db 17th-postgresql-9.6
Chugoku db 17th-postgresql-9.6Chugoku db 17th-postgresql-9.6
Chugoku db 17th-postgresql-9.6
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 

More from 啓介 大橋

App Dojo 2017 12月 - VUI in your app with Dialogflow -
App Dojo 2017 12月 - VUI in your app with Dialogflow -App Dojo 2017 12月 - VUI in your app with Dialogflow -
App Dojo 2017 12月 - VUI in your app with Dialogflow -啓介 大橋
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン啓介 大橋
 
Fusion360 meetup vol2 LT
Fusion360 meetup vol2 LTFusion360 meetup vol2 LT
Fusion360 meetup vol2 LT啓介 大橋
 
gcp ja night #27 Google Cloud Endpoints with Golang
gcp ja night #27 Google Cloud Endpoints with Golanggcp ja night #27 Google Cloud Endpoints with Golang
gcp ja night #27 Google Cloud Endpoints with Golang啓介 大橋
 
Tokyo gas #5_whatsnewinappsscript_公開用
Tokyo gas #5_whatsnewinappsscript_公開用Tokyo gas #5_whatsnewinappsscript_公開用
Tokyo gas #5_whatsnewinappsscript_公開用啓介 大橋
 
Dart flightschool cloudendpoint with dart
Dart flightschool cloudendpoint with dartDart flightschool cloudendpoint with dart
Dart flightschool cloudendpoint with dart啓介 大橋
 

More from 啓介 大橋 (6)

App Dojo 2017 12月 - VUI in your app with Dialogflow -
App Dojo 2017 12月 - VUI in your app with Dialogflow -App Dojo 2017 12月 - VUI in your app with Dialogflow -
App Dojo 2017 12月 - VUI in your app with Dialogflow -
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
Fusion360 meetup vol2 LT
Fusion360 meetup vol2 LTFusion360 meetup vol2 LT
Fusion360 meetup vol2 LT
 
gcp ja night #27 Google Cloud Endpoints with Golang
gcp ja night #27 Google Cloud Endpoints with Golanggcp ja night #27 Google Cloud Endpoints with Golang
gcp ja night #27 Google Cloud Endpoints with Golang
 
Tokyo gas #5_whatsnewinappsscript_公開用
Tokyo gas #5_whatsnewinappsscript_公開用Tokyo gas #5_whatsnewinappsscript_公開用
Tokyo gas #5_whatsnewinappsscript_公開用
 
Dart flightschool cloudendpoint with dart
Dart flightschool cloudendpoint with dartDart flightschool cloudendpoint with dart
Dart flightschool cloudendpoint with dart
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Recently uploaded (9)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

パフォーマンスの良いGASの書き方 Best Practice

Editor's Notes

  1. https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0
  2. https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0
  3. https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0
  4. https://docs.google.com/spreadsheets/d/1kzi8pXTZZrABgTGbJFqSZrCHMCRL-LEEqQK2n4yQO-o/edit#gid=0