自作ファイルを他の人に使ってもらうには？社内にscriptを共有した覚書_アラフィフGAS初心者が業務効率化

会社の業務を効率化したくて2021年1月からGoogle Apps Scriptを始めました。
JavaScriptも知りませんでした。そんなわたしが作業していて悩んだことを残します。
具体的なソースは業務関連なので掲載してません。
<br>
#自作ファイルを同僚に渡したら面倒なことになった！
<br>
スクリプトを仕込んだシートができあがったので、同僚にも共有しようとファイルをコピーして何人かに渡しました。

しばらく経ったある日、わたしが思ってなかった使い方をした人がいてエラーが出てしまいました。
そのことでスクリプトを修正したくなったのですが・・・。

ファイルを修正するには<font color="Green">**配布した人の数だけスクリプトを更新**</font>しないといけなかったのです。

スクリプトの種類を考えてみたら当たり前なんですけどね。
<br>
####基本中の基本 ｜ GASのスクリプトの種類とは？####

>* <font color="Green">**スタンドアロン（スクリプト）**</font>
     シートやフォームに関連付けられていないスクリプト 

>* <font color="Green">**バインドスクリプト**</font>
     あるシート（もしくはフォームなど）に関連づけられたスクリプト
ファイルの中からスクリプトエディタを呼び出しコーディングできる。

<br>
わたしが作ったのはシートに関連づけられた<font color="Green">**バインドスクリプト**</font>だったので、ファイルをコピーした分だけスクリプトが作られてしまっていたわけです。

ただ幸いだったのはわたしが書いたスクリプトは<font color="Green">**AppScript**</font>（ https://script.google.com/home ）に全てまとめられていたので配布済みのファイルから辿っていく必要はなく、コードの改修でコピペする作業はそれほど大変ではなかったです。
<br>
####配布する数が少ないならそのままでもいいかも####

もし配布すべき人が少人数なら複数のバインドファイルをメンテナンスする方法でもいいかもしれません。

というのもわたしが選んだやり方はメンテナンス性は上がりますが、少し面倒です。
それにスクリプトの書き方もクラスやコンストラクタが必要になります。

もしも、スクリプトの内容をコピペでまかなっている場合、元のスクリプトの多くはそのように（オブジェクト指向で）は記載されていないことが多いのです。
他の人の書いたスクリプトを改変するのはスクリプトを勉強したい方は別ですが、今の仕事を楽にしたいことが主目的の方には余計な仕事だと思うのです。
素人が手軽にプログラムの恩恵を受けられるはずのGASが全然手軽じゃなくなっちゃう。
そうすると効率化が楽しくなくなっちゃう。

わたしの場合ですが、慣れてないので自作のスクリプトにもかかわらず普通にバインドスクリプトを書くより改修の方が時間がかかりました。
業務効率を上げるのが目的なら、これに時間をかけるのは本末転倒かもなぁって思います。
結果、シンプルで合理的な方を選んだ方がいいです。
<br>
#モヤモヤしながら手がかりが欲しくて検索をしてみた#
<br>
どんな方でも書いたスクリプトは<font color="Green">**AppScript**</font>（ https://script.google.com/home ）に全てまとめられますが、AppScriptはフォルダが作れないのでスクリプトが増えるとお目当てのスクリプトが見つけづらくなります。

GASはプログラマーなどの玄人ばかりが利用するものではないにしても、この方法では管理しづらいし、複数のシートから一つのスクリプトを参照する方法がありそうだなぁと思い

``` GAS シート 社内共有```

で検索してみました。
<br>
すると**ライブラリ**、**デプロイ**といった単語が混じったページがヒットしてきました。
複数の記事を読み進めていくうちに、
>後々改修が必要になるかもしれない細々とした処理を記載した関数部分は<font color="Green">**スタンドアロン（スクリプト）**</font>をライブラリに登録しておいて
シートの<font color="Green">**バインドスクリプト**</font>に単純にライブラリの関数を呼び出す記載をすれば良い

とわかりました。
書き直す可能性がある部分だけは１つのファイルにしておく方法です。

<br>
#ファイルを改修してライブラリに登録する#
<br>
バインドスクリプトだったファイルをライブラリ用に書き直しました。
この時感じたわたしなりのポイントをまとめました。

><font color="Green">**ライブラリ側**</font>
クラスとコンストラクタを用意して、具体的な処理はメソッドに書く
ライブラリ内で使う外から呼び出す予定がないfunctionはクラスにしなくてもよい

<br>

><font color="Green">**バインドスクリプト側**</font>
newしてメソッド呼び出すだけ
修正しないつもりで単純に書く
（ライブラリのメソッドは直接呼び出せない）

分離作業は2つを同時にひらきながら書くとやりやすいと思いました。
最初からライブラリ用のgsを書くならデバッグもあるので個々に書いた方がやりよいですね。

こうしてできたスクリプトをライブラリにします。

ライブラリにする際に地味に困ったのが<font color="Green">**IDEが新しくなっていたこと**</font>です。
変わりたてだったので先人の皆様の残した書きつけがそのまま利用できなかったのです。
<br>
###1.プロジェクトの共有###
ライブラリにするスクリプトを共有します。共有の設定は赤く囲ったアイコンからします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/f85be954-9899-d372-b42b-6658461b6989.png)
<br>
クリックすると設定画面が出てきます。
同じ会社の人だったら誰でも使ってもらっていいので、<font color="Green">**グループのメンバー全員が閲覧できます**</font>に設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/dbf9a984-a21d-7c68-17de-7234aaa11b08.png)
<br>
###2.デプロイする###

デプロイって何でしょうね？
わたしは使える状態のものとして登録しておくって捉えてます。
スクリプトに改修があった場合、今後少しずつ内容が違ったものが作られていきます。どれも動く状態としてAppScriptのIDEに登録しておけるようです。

さぁ、デプロイを始めましょう。
ライブラリにするスクリプトの**デプロイボタン**をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/e8926975-9944-bbe0-8962-a099a4a8d9e8.png)

新しいデプロイの設定画面が出てきますので、**ライブラリ**を選んでください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/7e257774-7bf4-3cc6-1e41-fd14be5bed72.png)

説明を入力して**デプロイボタン**をクリックします。
わたしが参考にしたサイトによると<font color="Green">**新しい説明文の欄に日本語を入力するのは厳禁**</font>のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/75a41e1e-a85f-77ad-4807-9977325f38a5.png)


**完了**をクリックしてデプロイを終えましょう。
（雑談ですが、このキャプチャを作成用に何も書いてない関数を使ったのですが、無でもライブラリにできるんだなぁと驚きがありました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/5ec02a84-ef3b-cebb-bd34-bc641a8eb524.png)

###3.スクリプトIDの場所###
こちらはライブラリにしたスクリプトの「プロジェクトの設定」画面です。
（IDEの左側のアイコン群の歯車をクリックすると開きます）

スクリプトIDは赤で塗りつぶしている範囲にあります。
先ほどデプロイした関数を別のファイルから呼び出すために、こちらの<font color="Green">**スクリプトIDをバインドファイルに読み込み**</font>ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/817150e5-854f-936c-d93d-4093b1f5e3c7.png)


わたしは**マニフェスト**は表示派です。実際にはチェックを入れてます。
タイムゾーンを設定したり、ライブラリを読み込む際にも役立ちました。
普段は表示しないにしろjsonの中身をみておいてよかったなぁ。
もしGUIがうまく動かないことがあってもファイルの中身を見ていたおかげで、どっかで見たことあるファイルの記述だ。あれに直接書き込めばいいのかもしれないと・・・
調べまわってもわからないことも自力で突破できる糸口が得られたからです。

<br>
#バインドファイルにライブラリを読み込む#
<br>
バインド側のファイルを開き、<font color="Green">**ライブラリの横の+**</font>をクリックします。
ライブラリの追加画面が出てきます。

ここに先ほどのライブラリファイルの<font color="Green">**スクリプトID**</font>をバインドファイルに読み込みます。

先ほどのライブラリの現在呼び出せるバージョンの一覧がドロップダウンリストで出てきます。
リストの内容は、HEAD（開発モード）と先ほどデプロイした1（説明：version.1）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/5d3fa6fe-0df7-3ed3-181e-d1833d6b5a2f.png)

今はリリース前の想定なので、1を選択します。
（HEADでもいいです。後から変えられるので。）

赤枠で囲ったIDの欄に**任意の名称**をつけます。

```const abc = append.createABC();```

のようにIDの後にコンストラクタ名で処理を呼び出すことになりますのでaaaとか適当にしちゃうと複数のライブラリが入ると、どのライブラリか中身がわかりづらくなりますよ。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/d9fd3409-533b-5f10-70d9-2aa9c9deb815.png)

追加をクリックするとライブラリが追加されています。
ライブラリを呼び出して、ざくざく書いていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/9ad51fa8-01d2-c7a7-3313-6a20d80c36a1.png)

<br>
###IDが登録できなくて困った###
実は何故か任意のIDが登録できなくてとても苦労したのです。
弄り回すうちにマニフェストファイルに直接書いたらいいのでは・・・とわかりました。
（マニュフェスト appsscript.json はプロジェクトの設定でチェックを入れるとエディタに表示されます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/5cef0004-9860-4083-217b-71b4c0af1fab.png)

他にそんなことで困っている人は居なさそうだったのですが、IDEの変わり目なのでお役に立てば。

```appsscript.json
    "libraries": [
      {
        "userSymbol": "Id_name",
        "version": "1",
        "libraryId": "this area fill up with script id",
        "developmentMode": false
      }
    ]
```



<br>
#改修したファイルを配布したけれど自分以外はエラーになる！#
<br>

ライブラリファイルを呼び出すように改造したので、再配布しようと試しに実行してもらいました。
ところが動かないんです。
「function hogehogeは定義されてません。」ってエラーが出ます。
自分は動くのに。

自分は動くから、権限関係でしょう。
ファイルの共有もしてるし・・・ってわからなかったのですが、調べてみるとライブラリを<font color="Green">**Google Cloud Platform（GCP）プロジェクト**</font>にしないといけないようです。

設定ファイルの下の部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/20514f5b-fb40-5729-d810-bbfa57accff6.png)

Google Cloud Platformで新しいプロジェクトを作って<font color="Green">**プロジェクト番号**</font>を設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556275/79a5cd40-05ad-4515-f32e-1f8aeceb776b.png)

この辺りの設定を覚えていないこととキャプチャが取れてなくて恐縮なんですが・・・実行可能APIにして読み込みしたところ無事に動くようになりました。
新しいプロジェクトを登録する際にまた更新します。

#参考にした本・ページ#

###全体的には本で###
図書館で初版に出会い今までwebで調べながらしていたのが効率悪いのに気付きました。
ひと月くらい読み耽り、会社に第2版を買ってもらいました♡ 
コピペしない派の方にはこの本がよいのではと思います。今では手軽に辞書っぽく使います。
操作画面は旧IDEで紹介されています。

https://www.amazon.co.jp/Google-Apps-Script%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80-Google%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8Google-Workspace%E3%81%AE%E6%9C%80%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AC%E3%82%A4%E3%83%89/dp/4798063339/

###ライブラリのことなど###
ライブラリについて調べているうちに上の本の作者の方のページにたどり着きました。新IDEで紹介されています。

https://tonari-it.com/gas-perfect-book-new-ide-library/


###実行可能APIのことなど###
ライブラリにしても「function hogehogeは定義されてません。」と自分以外の人の環境で出てくるので、検索してたどり着きました。操作画面は旧IDEで紹介されてます。

https://www.pnkts.net/2019/12/17/gas-library

###レファレンス###
本に載ってないことがあるので・・・でも英語なのですわ。
でも日本語で読むと意味わからんくなってくることもあるのですわ。
結局、英語版に戻るのですわ。

https://developers.google.com/apps-script/reference