よく利用するGASのメソッドまとめ

# はじめに 
最近、GoogleフォームとGAS、スプレッドシート、Googleチャットを使って、有給休暇の管理システムを構築しました！
久々にGASを利用したので、備忘録がてら、よく利用するメソッドをまとめます。

本記事は使ったメソッドだけに絞っているので、詳細は[本家](https://developers.google.com/apps-script/reference/document)をご確認ください:bow:

# なぜGASを使ったのか 
### 無料だから 
ある程度の制約はありますが、やはり、無料というのは大きいですね。

### 短期間で作れるから 
フォームとスプレッドシート、チャットはすでに用意されているので、あとはそれらをGASで繋ぎ込むだけです。要はローコード開発です。
もちろん、理想はWebアプリ作ることなんですが、やろうと思うと、とても時間がかかります。
特に社内での業務効率化など、今あるものでササッと作れるなら、それが一番ではないでしょうか。（運用してみて、GASでの限界が見えてきたら、Webアプリなども検討します）

### ちょっとしたチャレンジ 
無料でどこまでやれるか、というのは、誰でも一度は考えたことがあるはず。
さまざまな理由で断念することもあると思いますが、まずは限界までチャレンジしてみたらいいんじゃないかな、と考えてます。

# よく使うメソッド 
お待たせしました！
ここから、よく使うGASのメソッドをまとめていきます！

## Googleフォーム関連 
### getItemResponses() / getTitle() / getResponse() 
フォームで送られたきた内容を取得するメソッドです。
フォームに「メッセージ」という項目がある場合、入力値を取得するには以下のように使います。
```
function onFormSubmit(e){
  let itemResponses = e.response.getItemResponses();
  ...
  let message = "";
  for (var j = 0; j < itemResponses.length; j++){
    let itemResponse = itemResponses[j];
    let title = itemResponse.getItem().getTitle();
    let response = itemResponse.getResponse();

    switch (title) {
      case "メッセージ":
        message = response;
        break;
      ...
    }
  }
}
```

### getRespondentEmail() 
送信者のメールアドレスを取得します。（Googleにログインしている場合）
特に組織内で使っているフォームでは、メールアドレスを取得したいケースが多いため、よく使ってます。
```
function onFormSubmit(e){
  let mailAddress = e.response.getRespondentEmail();
  ...
}
```

## スプレッドシート関連 
### openById() 
既存のスプレッドシートを開く際に、よく使います。
```
let user_master_sheet_id = "xxxxxxxxxxxxxxxx";
let ss = SpreadsheetApp.openById(user_master_sheet_id);
```

### getActiveSpreadsheet() 
スプレッドシートからGASを作成する際によく使います。
```
let ss = SpreadsheetApp.getActiveSpreadsheet();
```

### getSheetByName() 
openById()で開いたスプレッドシートから、シート名でオブジェクトを取得します。
```
let user_master_sheet_id = "xxxxxxxxxxxxxxxx";
let ss = SpreadsheetApp.openById(user_master_sheet_id);
let userSheet = ss.getSheetByName("ユーザー一覧");
```

### getDataRange() 
シート内でデータが入っている範囲を一括で取得してくれます。
上のユーザー一覧から、フォームを送信したユーザーの情報を取得したい場合などによく利用します。
```
let user_master_sheet_id = "xxxxxxxxxxxxxxxx";
let ss = SpreadsheetApp.openById(user_master_sheet_id);
let userSheet = ss.getSheetByName("ユーザー一覧");
let dataRange = userSheet.getDataRange();
```

### getValues() 
範囲内の値を配列で保持してくれます。
フォームの送信者情報をユーザー管理シートから抽出する際に、この配列を回して処理するケースが多いです。
```
function onFormSubmit(e){
  let mailAddress = e.response.getRespondentEmail();
  ...
  let userName = "";
  let mailCol = 1;
  let nameCol = 2;
  let user_master_sheet_id = "xxxxxxxxxxxxxxxx";
  let ss = SpreadsheetApp.openById(user_master_sheet_id);
  let userSheet = ss.getSheetByName("ユーザー一覧");
  let dataRange = userSheet.getDataRange();
  let allValues = dataRange.getValues();

  for (let i = 4; i < allValues.length; i++) {
    if (allValues[i][mailCol] && allValues[i][mailCol] == mailAddress){
      userName = allValues[i][nameCol];
      ...
      break;
    }
  }
  ...
}
```

### getRange() 
特定の範囲を指定して取得するメソッドです。
```
let user_master_sheet_id = "xxxxxxxxxxxxxxxx";
let ss = SpreadsheetApp.openById(user_master_sheet_id);
let userSheet = ss.getSheetByName("ユーザー一覧");

// 以下はC2を取得したい場合（左から行番号、列番号）
let range = userSheet.getRange(2, 3);

// 以下はC2からD3までの範囲を取得したい場合（左から行番号、列番号、行数、列数）
let range2 = userSheet.getRange(2, 3, 2, 2);
```

### setValue() 
特定のセルに値をセットするメソッドです。
```
let today = Utilities.formatDate(new Date(), "JST","yyyy/MM/dd");
let user_master_sheet_id = "xxxxxxxxxxxxxxxx";
let ss = SpreadsheetApp.openById(user_master_sheet_id);
let userSheet = ss.getSheetByName("ユーザー一覧");

// C2に今日の日付が入る
let range = userSheet.getRange(2, 3);
range.setValue(today);

// C2からD3に今日の日付が入る
let range2 = userSheet.getRange(2, 3, 2, 2);
range2.setValue(today);
```

### setValues() 
二次元配列で値をセットするメソッドです。
```
let date = new Date();
let user_master_sheet_id = "xxxxxxxxxxxxxxxx";
let ss = SpreadsheetApp.openById(user_master_sheet_id);
let userSheet = ss.getSheetByName("ユーザー一覧");

// 入社日
let joinDate = Utilities.formatDate(date, "JST","yyyy/MM/dd");
// 有給休暇の付与日
let tmpDate = date.setMonth(joinDate.getMonth() + 6);
let addDate = Utilities.formatDate(date, "JST","yyyy/MM/dd");

let data = [
  ["入社日", joinDate],
  ["有給休暇の付与日", addDate],
];

// C2からD3に入社日と付与日の日付が入る
let range = userSheet.getRange(2, 3, 2, 2);
range.setValues(data);
```

## 日付関連 
### formatDate() 
日付関連の処理を行う際は、必須ですね。
```
let today = Utilities.formatDate(new Date(), "JST","yyyy/MM/dd HH:mm:ss");
```

### getTimezoneOffset() 
現在のロケールから協定世界時 (UTC) までのタイムゾーンの差を分単位で返します。
これが「-540」であれば、JSTである、という判断ができます。
```
let today = new Date();
let offset = today.getTimezoneOffset();
```

### setMonth() 
3ヶ月後、6ヶ月後、6ヶ月前などを取得したい場合に使います。
```
let today = new Date();
// 6ヶ月後
today.setMonth(today.getMonth() + 6);
```

## 配列関連 
### filter(Boolean) 
配列から、空の要素を削除してくれます。
ただし、0も空要素の扱いになってしまうので、注意しながら使いましょう。
```
let values = ["", "aaa", "", "", "bbb", "ccc", 0, "ddd"];
console.log(values);

let clernValues = values.filter(Boolean);
console.log(clernValues);

// 出力結果
[ '', 'aaa', '', '', 'bbb', 'ccc', 0, 'ddd' ]
[ 'aaa', 'bbb', 'ccc', 'ddd' ]
```

# さいごに 
個人的によく使うものだけをまとめました。
他にも便利なメソッドはたくさんあるので、いろいろチャレンジして、ローコード開発を楽しみましょう🙂