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
Apps Scriptによるより高度な開発プロセス/More Advanced Develop...
Search
MURAKAMI Masahiko
October 18, 2016
Programming
2.5k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Apps Scriptによるより高度な開発プロセス/More Advanced Development Process with Apps Script
MURAKAMI Masahiko
October 18, 2016
More Decks by MURAKAMI Masahiko
See All by MURAKAMI Masahiko
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
330
AWS Blocks を触ってみた/first-tach-aws-blocks
fossamagna
2
190
AWS Amplifyをもっと便利に使うための取り組み/amplify-tools-and-contributions
fossamagna
1
160
Amazon Verified Permissions実践入門 〜Cedar活用とAppSync導入事例/Practical Introduction to Amazon Verified Permissions
fossamagna
2
410
Amplify Gen2から知るAWS CDK Toolkit Libraryの使い方/How to use the AWS CDK Toolkit Library as known from Amplify Gen2
fossamagna
1
950
AWS Amplify Gen2向けのVSCode拡張を作って公開してみた話/lts-techday-2024
fossamagna
0
60
CDKアプリとしてのAmplify Gen2 - @aws-amplify/backendのアーキテクチャにみるCDKベストプラクティス -
fossamagna
3
3.7k
Amplify Gen2の 新機能と実践的な使用例 AWS Amplify Gen 2 Festival in Japan/New features and practical use cases in Amplify Gen2
fossamagna
0
860
Amplify Gen2を 拡張してみよう JAWS-UG北陸新幹線 ( 福井開催 ) 2024-04-06/Let's extend Amplify Gen2
fossamagna
0
1.1k
Other Decks in Programming
See All in Programming
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
450
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
480
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
400
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
200
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
240
継続モナドとリアクティブプログラミング
yukikurage
3
650
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.1k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
2.4k
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
140
Foundation Models frameworkで画像分析
ryodeveloper
1
140
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
110
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
390
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Deep Space Network (abreviated)
tonyrice
0
230
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Bash Introduction
62gerente
615
220k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
57k
エンジニアに許された特別な時間の終わり
watany
108
250k
Transcript
Apps Script によるより高度な 開発プロセス html5j web platform 2016-10-19 村上 雅彦
@fossamagna
村上 雅彦 a.k.a @fossamagna 株式会社 永和システムマネジメント 所属 2
今日のお話 Apps Script による高度な開発プロセスの紹介(G Suite Developers Blog のおさらい) さらに高度な開発プロセスの紹介 3
Apps Script による高度な開発プロセ スって? 2015/12 に G Suite Developers Blog
( 当時は Google Apps Developers Blog) で紹介された開発 プロセス Google 上のApps Script はランタイムとして利用す る コー ディングなどは開発者のマシン上で行う 参考 : https://googledevjp.blogspot.jp/2016/01/apps- script.html 4
一言でいうと、Drive API Export / Import を利用した Apps Script のロー カル開発
5
Drive API Export /Import Google Drive REST API で Apps
Script のソー スコー ドをインポー ト・ エクスポー トする機能。 Google Drive 上の Apps Script (.gs ファイル、.html ファイル) をロー カルマシンにエクスポー ト( ロー カ ルマシンからのインポー ト) が可能 https://developers.google.com/apps-script/import- export node-google-apps-script , gas-manager を使えばコマン ド1 つでエクスポー ト・ インポー トが可能 6
Drive API Export /Import ( 注意点1) スタンドアロー ンプロジェクトのみ可能 SpreadSheet やDocs
などのコンテナ付属のプロ ジェクトは不可 SpreadSheet の独自関数などはコンテナ付属のプ ロジェクト必須なので対象外 アプリのバー ジョン管理、Web アプリの公開、 実 行はできない Script Editor で実施する 7
Drive API Export /Import ( 注意点2) JavaScript のコー ドのバリデー ションが実行され
る。 バリデー ションに引っかかると5xx エラー にな る。 部分的なインポー ト・ エクスポー トはできない プロジェクトのソー スは全てインポー ト・ エク スポー ト 8
いろいろ注意点があるけど Export/Import してロー カル 開発することのメリットは? 9
ロー カル開発でのメリット Git などでソー ス管理できる 好みのエディタやIDE を利用できる Lint やminify などのツー
ルが利用できる テストが実施しやすい 10
とりあえず、 ロー カルマシン にソー スコー ドを持って来れ ば、 あとはこっちのもの! 11
実際にメリットを活用した一 歩進んだ開発プロセスを紹介 12
Apps Script でも require() 関 数を使おう 13
require() とは CommonJS のモジュー ル機能。 Node.js ならネイティブに利用可能 Browserify やWebpack を利用することでブラウザ
環境でも 14
Apps Script でも Browserify を利用して require() を使って みよう! 15
と、 その前に 16
Apps Script にも「 ライブラリ」 とい うモジュー ル機能がある https://developers.google.com/apps- script/guide_libraries 17
Apps Script ネイティブのモジュー ル 機能は ライブラリ Apps Script のプロジェクトを別のプロジェクトか ら利用する仕組み
ライブラリ側は普通にコー ディング、 あとは公開す るだけ 利用する側は使いたいライブラリをScript Editor で ライブラリのプロジェクトキー を指定して利用す る 利用時は利用側がライブラリに割り振ったオブジ ェクトに生やした形式で利用できる 18
ライブラリの利用したコー ド例 Project: LibA function sum() { return Array.prototype.slice.call(arguments) .reduce(function(previousValue,
currentValue) { return previousValue + currentValue; }); } Project: App function main() { var sum = LibA.sum(1, 2, 3); Logger.log(sum); // 6.0 } 19
ライブラリの問題点 遅い 別プロジェクトを読み込んで実行するので遅い 公式サイトでトップで警告している 管理が手動 ライブラリの追加・ 削除はScript Editor のUI か
らのみ可能 ライブラリとアプリ側で何が共有されるかが複雑 Script Properties はライブラリ側で作成したイン スタンスが全てのアプリで共有されるなど 20
一歩進んだ開発での解決策 それが require() 21
Apps Script での require() は Browserify + gasify で実現 22
Browserify + gasify のポイント Browserify ならApps Script のライブラリに頼らず にモジュー ル機能を利用できる
依存モジュー ルの管理もpackage.json で可能になる npm で公開されているもジュー ルが利用できる( 使 えるものは) Browserify だけではApp Script で実行可能なコー ド が出力できないので gasify と組み合わせて利用す る 23
Apps Script で require() するサンプルコー ド app.js sum.js module.exports =
function sum() { return Array.prototype.slice.call(arguments) .reduce(function(previousValue, currentValue) { return previousValue + currentValue; }); }; var sum = require('./sum'); global.main = function () { // `global` オブジェクトに関数を代入する Logger.log(sum(1, 2, 3)); // 6.0 }; 24
Apps Script 向け browserify での ビルド方法 次のコマンドを実行するだけ。 $ browserify main.js
-p gasify -o bundle.js ビルドは通常のJavaScript と同じように browserify を実行する。 global オブジェクトのプロパティに代入された関 数から関数宣言文を生成させるので、 gasify の指 定を忘れずに。 25
ビルドしたファイルは Drive API Export /Import でプロジェクトにイン ポー トすれば gas-manager ,
node-google-apps-script を使えばコマンド1 つ でインポー ト可能 26
これであなたも今日から require() し放題! 27
require() でモジュー ル化でき たらテストもしやすい 28
Apps Script での自動テスト 29
Apps Script 向けのテストフレー ムワ ー クの種類 Node.js で実行するタイプ Apps Script
固有のオブジェクトはモックで代用 Apps Script として実行するタイプ Apps Script 固有のオブジェクトは本物を利用 30
既存のテストフレー ムワー ク( ライブラ リ) Node.js で実行するタイプ gas-local Apps Script
として実行するタイプ QUnit for Google Apps Script rajah gsunit gast 31
CI でもテストできるの? 32
Node.js で実行するタイプは モックを利用するので通常の Node.js で実行するテストと あまり違わない 33
Apps Script として実行するタ イプのテストフレー ムワー ク はCI との連携が難しい 既存のものはScriptEditor からやWeb
アプリとして実行す ることが前提になっている 34
無いものは作ればいい( 作った) gas-test ( シンプルなテスト実行フレー ムワー ク) JSON, XML, Logger
から選択して結果を出力可能 gas-test-cli (gas-test を利用するためのCLI ツー ル) テストコー ドのビルド機能( gas-test のテストを 実行して結果を返すコー ドでラップ) gas-test の実行機能(Execution API でテストコー ドを実行) gas-test を実行するために必要な認可のセットア ップ機能 35
Apps Script のテストとCI の連携 基本構成 [CI Server] -> Execution API
-> [Apps Script] Execution API を利用してCI サー バからApps Script のテストコー ドを実行する(Web アプリでは認証周 りに問題が残る) 実行結果をCI サー バで評価してテストの成功可否 を判断 xUnit フォー マット、JSON フォー マットをCI サ ー バに返す。CI サー バ側でレスポンス内容を評 価。 36
gas-test サンプルプロジェクト https://github.com/fossamagna/gas-test- sample 37
高度な開発のオススメ構成 Drive API Export/Import を利用してロー カルのソ ー スをデプロイする ソー スはGit
等で管理、 ロー カルのソー スは Browserify + gasify + (Babel) でビルドする 開発用、 自動テスト用、 プロダクションの各環境 毎にプロジェクト(Drive 上のApps Script) を作成す る gas-test でCI サー バと連携させて自動テストを実行 する master ブランチにpush されたたらCI でビルドして 自動デプロイも 38
Apps Script で高度な開発プロセス を始めてみよう! 39