【GAS】myコーディングルール/よく見るサイトを自分なりにまとめておく

## まえがき/やりたいこと
・一人開発でGAS/JavaScriptのスクリプトを毎月書いている
・開発部署ではない+社内でGASを書いている人がほぼ自分のみのため、コーディングルールがまともに存在しない
→自分だけでもコーディングルールを統一して、今後の開発や、万一人が増えたときに対応できるようにしておきたい

## 参考URL
この記事を作るときに参考にしたURL

[Qiita: 変数/クラス名の命名規則に使われる記法の分類](https://qiita.com/yimajo/items/a3fac0026c07ec538fc2)
キャメルケースとかスネークケースとかのやつ

[Qiita: 定数を大文字にするのはどんなときか](https://qiita.com/rana_kualu/items/e912d94cebd5c7ef73af)
コーディングルールで大文字小文字がどうのこうので悩んだときに


# よく見るサイト
なんか困ったときによく見るURL

[Google Apps Script: Reference](https://developers.google.com/apps-script/reference)
まずはこれを見よう

[Google Apps Script: Guides > Quotas for Google Services](https://developers.google.com/apps-script/guides/services/quotas#current_limitations)
GASが一日に実行できる特定動作(ドキュメント作成とか、Gmail読み取りとか)の制限について

[Qiita: GoogleAppsScriptのチートシート](https://qiita.com/sahksas/items/e08996327b18df27b27e)
基本的な関数の使い方や組み合わせ例


# myコーディングルール



## 基本方針
**・変数系はローワーキャメルケースを使う**
`test1_methodHogeHoge`
最初は小文字、あとは単語ごとに頭文字を大文字で使う
意味のまとまり(？)をもたせたい場合は、アンダースコアでつなぐ
アンダースコアの後ろの頭文字は小文字

**・定数系はconstで定義、グローバルに置いて何度も使う定数は大文字でアンダースコアつなぎ**
IDとかSTRとかでグループ分けする
`const ID_FOLDER_MASTER = "hogehoehoge";`

・頭文字を大文字にするとIDEで補完表示ができるので、ほしいときは使う
`const Ss = SpreadsheetApp.getActiveSpreadsheet();`
`const Sheet_main = Ss.getSheetByName("メイン");`
→こうすると補完で出てくる

**・ある程度のまとまりのある定数はオブジェクトで定義すると便利**
セル番地の定数とか
`const startRange = {row:2,column:2}`
自分はセル番地の定数をまとめてオブジェクト化している
```sample.gs
const rangeValue = {
  data:{row:2,column:2,width:3},
  getDate:{row:1,column:1}
}
```
セルの読み取りしてることがわかりやすくて良い

<details><summary>コメント・メモ・感想的なアレ</summary><div>
キャメルケースだったらアンダースコアつなぎは本当は使わないけど、自分はアンダースコアで変数定数にある程度まとまりをもたせたいし便利だと思ってるので使う。集団で開発するときはやめたほうがいい

`function main1_createFolder(){}`的な

</div></details>



## コーディングルール_個別

### main系関数以外(引数が必要でなんか処理して返り値を返すタイプの関数)にはできるだけJSDocコメントを書く

参考
[GASの新エディタで自動補完を効かせて快適にプログラムを組もう](https://gas.excelspeedup.com/gas_neweditor/)
[【初心者向けGAS】Google Apps Scriptのドキュメンテーションコメントの書き方](https://tonari-it.com/gas-documentation-comment/)
[stackoverflow: Autocomplete for my functions in the google-apps-script editor](https://stackoverflow.com/questions/27883315/autocomplete-for-my-functions-in-the-google-apps-script-editor)
JSDocコメントを書くと関数を呼んだときに型の推論が効いたり、ヒントを出したりできる

```javascript:test.gs
/**
 * @param {number} a
 * @param {number} b
 * @return {number} result
 */
function test(){
  let a = 1;
  let b = 2;
  result = a + b;
  return result;
}
```

画像：GASエディタ内で関数を呼び出すときに、引数と型が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139599/7354d7c4-1eb2-74a1-ddea-9bf7a6cebf6f.png)

### constとletについて
・「var」は使わない、「const」ですむところはできるだけconst、他は「let」
・スコープはできるだけ小さく、スプレッドシート・シートはグローバルで宣言しちゃう
参考：[JavaScriptで書く「var,let,const」の違いと使い分け方法](https://techacademy.jp/magazine/14872)

### Date型データのフォーマット

参考：[TF SYNNEX：GASでのDate型データのフォーマット](https://blog.synnex.co.jp/google/gas-data-format/)

|日時情報|形式|例(2021年1月2日(土) 午前0時3分4秒(JST)の場合)|
|:-:|:-:|:-:|
|年(西暦4桁)|yyyy|2021|
|年(西暦2桁)|yy|21|
|月(数字1～2桁|M|1|
|月(数字2桁)|MM|01|
|月(英語短縮)|MMM|Jan|
|月(英語)|MMMM|January|
|日(数字1～2桁)|d|2|
|日(数字2桁)|dd|02|
|曜日(英語短縮)|E|Sat|
|曜日(英語)|EEEE|Saturday|
|曜日(数字)|u|6(月曜：1、火曜：2、…日曜：7)|
|第n◯曜日(数字)|F|1(=第1土曜日)|
|午前/午後|a|AM|
|時(1～12時表記、数字1～2桁)|h|12 ※1時のとき：1|
|時(1～12時表記、数字2桁)|hh|12 ※1時のとき：01|
|時（0時～11時表記、数字1～2桁）|K|0 ※昼12時のとき：0|
|時（0時～11時表記、数字2桁）|KK|00 ※昼12時のとき：00|
|時（1時～24時表記、数字1桁～2桁）|k|24 ※1時のとき：1|
|時（1時～24時表記、数字2桁）|kk|24 ※1時のとき：01|
|時（0時～23時表記、数字1桁～2桁）|H|0 ※昼12時のとき：12|
|分（数字1桁～2桁）|m|3|
|分（数字2桁）|mm|03|
|秒（数字1桁～2桁）|s|4|
|秒（数字2桁）|ss|04|
|タイムゾーン（英語短縮）|z|JST|
|タイムゾーン（英語）|zzzz|Japan Standard Time|
|タイムゾーン（数字）|Z|+0900|



# ネーミングルール

## ファイル/フォルダ

- ID…「ID_…」const、大文字で管理

`const ID_FOLDER_MAIN = "hogehogehoge";`
`const ID_DOC_TEMPLATE = "hogehogehoge";`

- フォルダと各サービスを識別子で分ける

フォルダ…FOLDER
ドキュメント…DOC
スプレッドシート…SS
など

## スプレッドシート

- スプレッドシート…「Ss」1個しか使わないときは基本的にこれ

`const Ss = SpreadsheetApp.getActiveSpreadsheet();`
2個以上だったら`Ss_main`とかにする
Ssはグローバルで宣言していい…だいたいどの関数でも最初に呼び出すでしょ、と仮定

##シート

- シート…「sheet_hogehoge」で複数管理

`const sheet_main = Ss.getSheetByName(NAME_SHEET_MAIN);`
必要な関数ごとの最初に宣言

- シート名…「NAME_SHEET_HOGE」でconstでグローバルに置く

`const NAME_SHEET_MAIN = "main";`

- よく使うシート名メモ

| シート名 | 備考 |
|:-:|:-:|
| マスタ(△master) | データを読み込んだり書き出したりするシート |
| 設定(or setting) | 設定項目のうち、使用者が設定できるものを記載 |
| 使い方 | ツールの使い方を同じSS内に記載したいとき |
| properties | 設定項目のうち、使用者に変更させたくないものを記載 |
| master_xxxx | 参照用になんかのマスタをimportrangeしてくるときに使用 |
|   |   |

・人向けにスプレッドシートを作成するときのシート名は、使用者が使うシートは基本的に日本語にしておく

参考：[Qiita: 技術英語 Options, Settings, Properties, Configuration, Preferencesの違い](https://qiita.com/aosho235/items/ef7a99396f69442d2cf2)
よく悩むので参考にしている
※自分の場合は「作業者/使用者に自由に設定させていい項目→setting」「管理者/作成者が設定する項目→properties」あとはconfigを必要に応じて使う

## 関数名

- 関数…「testHogeHoge」ローワーキャメルケース+アンダースコアで記載

ある程度意味の区切りでグループ化する
`main1_createFolder()`
`main2_createFile()`
とか

## 変数

- 変数…「targetHoge」ローワーキャメルケース

# よく使う単語

## 業務上で使う単語

| 日本語 | 英語(コード) |略したいとき|
|:-:|:-:|:-:|
| 送付状 | CoverLetter |-|
| 請求書 | Invoice |-|
| 都道府県名 | prefecture |-|
| 市区町村名 | city |-|
| 自治体名(都道府県名+市区町村名) | municipality |-|
| 郵便番号 | postcode |-|
| 住所 | address |-|
| 部署名 | department |dept|
| 担当者名 | name_staff |-|
|年度|fisxalYear|fy|
|置き換え(差し込み印刷)|replace|rep|



## 接頭詞・接尾詞系

| 日本語 | 英語 | 略したいとき |
|:-:|:-:|:-:|
| ◯◯名 | name_ ||
| シート | sheet_ |   |
| ID | id_ |   |
| フォルダ | folder_  |   |
| 額(金額) | amount_ |  |
|   |   |   |
|   |   |   |
|   |   |   |
|   |   |   |
|   |   |   |
|   |   |   |