clasp、子階層フォルダ push/pull(clone) を調べた


# [clasp](https://github.com/google/clasp)について
- Google Apps Scriptをローカルで開発できる



自分は npm で提供されているパッケージをGASで利用するために利用しました。（esbuildでビルドして、ビルド後のファイルをアップした）

# したいこと

```:ファイル階層
- src（GASのファイルを入れるフォルダ）
    - ~.js
- appsscript.json
- package.json
```

上記の構成のように、srcフォルダ内部に既に作っていたGASのスクリプトをcloneして、作業後にpushしたいと考えていた。


# 結論

```bash:既存ファイル ダウンロード
$ mkdir src
$ clasp clone 元々作っているGAS --rootDir ./src
```

```bash:作成したファイルをアップロード
$ clasp -P src/ push
```

ちなみに pullも同様に `-P .src` で動作する。
```bash:pull
$ clasp -P ./src pull
```

(-Pオプションは `./src` でも `src/` でも動作してくれました)


-- --
# 調査メモ

以下、実行した流れを順にメモ。

## ダウンロード
### 最初に試したこと

```bash:既存ファイル ダウンロード
$ clasp clone 元々作っているGAS --rootDir ./src

ENOENT: no such file or directory, open 'src/.clasp.json'
```
というわけで、『src/.clasp.json』ファイルを作って再度実行しました。

### 次に試したこと

```bash:『src/.clasp.json』作成
$ mkdir src
$ echo {} > src/.clasp.json
```

```bash:既存ファイル ダウンロード
$ clasp clone 元々作っているGAS --rootDir ./src

Project file (src/.clasp.json) already exists.
```
echo 文が余計でした。（srcフォルダ内部にjsonファイルを作るのは claspがしてくれる）

### 三度目に試したこと

```bash:srcフォルダ作成のみの状態に（.clasp.json削除）
$ rm src/.clasp.json
```

```bash:既存ファイル ダウンロード
$ clasp clone 元々作っているGAS --rootDir ./src

Warning: files in subfolder are not accounted for unless you set a 'src/.claspignore' file.
Cloned 16 files.
...
```
一応成功したっぽい。
（warning内容について。pushする際、srcフォルダ内部に『.claspignore』がないと変なものをアップするよ...の意味?）


## アップロード

```bash:作業後、再びGAS上にファイルを送信。
$ clasp push

No valid 現在の絶対パス/.clasp.json project file. You may need to `create` or `clone` a project first.
```
現在のフォルダで `clasp clone` してないぞと怒られました。

### push解決策
 
https://github.com/google/clasp/issues/869

> `clasp -P src/ push` 

で動作するとのこと。

```bash: アップロードする
$ clasp -P src/ push

...
Pushed 17 files.
```

実証したところ、GAS上のファイルも新規に変更されていました。成功！


# 余計な調査

上記（結論の実行）で動いたのですが、`clasp push` だけで操作できないか調べることにしました。

考える余地として、`clasp push` 実行時に「現在のフォルダで clasp create（clasp clone）」していないと言われた部分に目をつけ、以下の動作を加えました。

（他ブログの解説でフォルダ毎に`.clasp.json`が必要とか言ってた記憶も。）



```bash:現在のディレクトリ部分に空のclasp管理を置く
$ clasp create --title container_gas --type standalone
$ clasp clone 元々作っているGAS --rootDir ./src
```

上記コマンド達を実行することで、『srcフォルダ』内部にGASファイルをダウンロードし、 `clasp push` のみでアップロードできるようになりました（ﾔｯﾀﾈ）

しかし、Google Driveを調べると、既存ファイルは変更されていませんでした。代わりに新たなGASファイル 『container_gas』 が存在していた。

更に『container_gas』内部のgsファイル名が以下のように `src/~` の名前になっていました。

![スクリーンショット 2023-04-12 13.18.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847454/465e4f88-e169-968a-b462-fec4fbab1b44.png)


「フォルダー名付き、gsファイル名」「既存GASファイル更新できない」の二重の悲しさ......



## 余計な調査結果
```bash:
$ clasp create --title container_gas --type standalone
```

- 上記処理によって、新たなGASファイル『container_gas』を作成・管理する
- push動作（`-P フォルダ名` なし）を実行するとカレントディレクトリの『.claspignore』に応じてファイルをアップロード
    - 階層構造がある場合、『**階層/ファイル名**』という名前でGAS上にアップロードされる


-- --
# clasp余談メモ（push以外のつまづき）

### グローバルインストール
npmの場合、claspをグローバルインストールしないとコマンド実行できないのをどうにかできないのかな？

https://www.ykicchan.dev/posts/2020-07-12
↑ yarn だと -g なくても動作する方法がある？

追記:
```json: package.json
{
  "scripts": {
    "clasp": "clasp"
  },
    ...
}
```
ローカルインストール後、package.jsonファイルに `"clasp": "clasp"` 部分を挿入する。
`npm run clasp` のコマンドで、グローバルインストール後の `clasp` コマンドと同等の操作可能。(単純にnpmの勉強不足)



ローカルでインストールした際には
- `npm run` 分、毎回のタイプ量が多くなる
- [コマンドライン引数は更にタイプ量増やす or 別ライブラリ使用が必要](https://qiita.com/qrusadorz/items/db042f65be95f34d6271) とのこと

なので、-g オプション付けてインストールした方が楽で良いのかも？


↑追記：
`npx clasp ...`で動く



### clasp login
` --no-localhost` をつけると自分の環境では認証エラーになった。

```
$ clasp login
```
上記コマンドで認証可能。


### npm インストールしたモジュールをGASで使用

https://qiita.com/kabokawakabo/items/5013e96da2f4602df889

「良記事へのリンク & 投稿主が困った部分の雑書き」の記事