GASの基本操作

#GAS操作の備忘録
システム案件でGASやpythonを使うことがよくあります。今回は、よく使うGAS操作をまとめました。
超初心者に向けて解説しようと思います。

目次
--
- GASとは
- 基本操作
  - アクティビティシートの取得
  - cellの取得
  - getRange()の応用
  - cellへの記述jp
  て
- アプリケーション(作ってみよう)
  - メール送信システム
  - Googleカレンダー
  - 自作にチャレンジ
 
GASとは
--
GASとはGoogle App Scriptの略でエクセルを自動で動かす操作はVBAで行われるのに対して、スプレッドシートの操作を行う場合はGASを使います。
GASはプログラミング言語のJavaScriptと似ていると言われます。(文法はほとんど同じ)
GASを使えるようになると、面倒なシート操作を自動で、決まった時間に行うことができます。また、大学生がお小遣い稼ぎとしての案件もいくつかありますので家で働きたい学生には嬉しいかもしれませんね

基本操作
--
###アクティビティシートの取得
アクティベートシートとは、これからいじっていくシートのことをいいます。
####今開いているスプレッドシートを取得する方法(ツール/スクリプトエディタで開く)
```
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getActiveSheet();  
```
####他人のアクティビティシートの取得
```
const spreadsheet = SpreadsheetApp.openById("key");
const sheet = spreadsheet.getActiveSheet();
```
『key』は操作したいスプレッドシートのurl部分に記述されている/d/key/のkeyの部分を取得すればOK
####シート名からアクティベートシートを取得
シート１からシート２へ情報を写したいときに使う関数です
ここで指定したシート名は一字一句あっていないとエラーが起こってしまいますので、コピペしましょう

```
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet2 = spreadsheet.getSheetByName("シート２");
```

###Cellの取得；getRange().getValue()を使い倒す
####下行って横と覚える。また、getしたcell内の値を取得したい時はgetvVlue()
```
A3=sheet.getRange(3,1).getValue()
A3=sheet.getRange('A3').getValue()
B3=sheet.getRange(3,2).getValue()
```
###getRange()応用
- ある行Xの列全て取得したい場合や、範囲指定したcellsを取得したい時。返り値はリスト。

```
getRange(行番号2,列番号1,行数3,列数5)
  行番号2: 2行目
  列番号1: 1列目(A列)
  行数3: 2行目から3行(2～4行目)
  列数5: 1列目から5列(A～E列)
   →→→ A2～E4のセル範囲を取得

ex)X行の1~5列のcellを取得
getRange(x,1,1,5).getValue()
```

- ある列の最終行(C列の最終行)やある行の最終列などの取得

```
//①列の先頭行から下方向に取得する
var lastRow1 = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
Logger.log(lastRow1); //5

//②列の最終行から上方向に取得する
var lastRow2 = sheet.getRange(sheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
Logger.log(lastRow2); //8

//①行の先頭列から右方向に取得するコード
var lastCol1 = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn();
Logger.log(lastCol1); //4
 
//②行の最終列から左方向に取得するコード
var lastCol2 = sheet.getRange(1, sheet.getMaxColumns()).getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).getColumn();
Logger.log(lastCol2); //7

```
- appendRow()で配列をシートの最終行に追加
- 
```
sheet.appendRow([a,b,c]);
```

###cellへの記述:setValue
続いて、getRangeで取得したcell情報のgetValue()を別のcellへ設置する

```
sheet2.getRange('A'+(i+1)).setValue(copya);
```
###時間関数（文字列を時間配列にする）/正規表現

```
yyyy年mm月dd日→yyyy/mm/dd　
  var new_data=day.replace('年','/');
  var new_data=new_data.replace('月','/');
　var new_data=new_data.replace('日','');
もし、(曜日)が入っていたら...
  var new_data=new_data.split('(');
```

###正規表現

```
name='第6回yyy大会'⇨yyy大会だけとりだしたい
  var name=current_sheet.getRange('D'+i).getValue()
  let replaceword=name.match(/第.*?回/g);
```

###検索機能;textFinder.findAll()
```
var textFinder = sheet.createTextFinder('調べたい検索ワード').useRegularExpression(true);
var cells = textFinder.findAll();

#取得したcellを覗きたい
Logger.log(cells)
for i in cells.length:
    print(cells[i])
```
正規表現を用いて検索したい場合は、.useRegularExpression(true)を追加することで可能です。正規表現がわからない方は以下のurlを参考にしてください。
>https://murashun.jp/article/programming/regular-expression.html

###トリガーについて
スクリプトエディターの時計マークからいろいろと覗いてみてください。

###時間の扱い(yyyy年mm月dd日（月曜)⇨yyyy/mm/dd)

```
yyyy年mm月dd日（月曜)⇨yyyy/mm/dd
  var new_data=day.replace('年','/');
  var new_data=new_data.replace('月','/');
  var new_data=new_data.replace('日','');
  var new_data=new_data.split('(');
```
###正規表現(第yy回mm大会⇨mm大会

```
  var name=current_sheet.getRange('D'+i).getValue()
  let replaceword=name.match(/第.*?回/g);
  var name=name.replace(replaceword,'')
```

アプリケーション
--
###メール送信システム
```
for(var j=startlow; j <= lastlow; j++){
       if (sheet.getRange(j,9).getValues() == '' ){
       try{
         //送信者リストを他のスプレッドから参照  
         var Address = sheet.getRange(j,3).getValue();  
         var subject = "タイトル";
         var content　 ="内容";
 //改行する場合は\n バックスラッシュはoption+¥
         MailApp.sendEmail(Address,subject,content_third);
         sheet.getRange(j, 9).setValue('送信済み');　
         }catch(e){
          //エラーをキャッチしたときの処理
             sheet.getRange(j, 9).setValue('送信不可').setFontColor("red");  
          }      
   }
```
###googleカレンダー操作
```
//読みこむカレンダの指定
const calender_id='メールアドレス';
const calender= CalendarApp.getCalendarById(calender_id);

//書き込むシート
var spreadsheet = SpreadsheetApp.openById("key");
var sheet = spreadsheet.getActiveSheet();
var record=[];

//日時の指定(調べる範囲の指定)
startDate.setMonth(endDate.getMonth()-1);//現在より１ヶ月前を指定
endDate=new Date(); //現在日時を取得

//カレンダーの情報を取得
//タイトルがバイトかどうか判断
var events = calender.getEvents(startDate,endDate); 
//var title = calender.getEvents(startDate,endDate).getTitle; 
for(const event of events){
　　var title=event.getTitle();
　　if(title == 'バイト'){
 var time= (event.getEndTime()- event.getStartTime())/(1000 * 60 * 60);
 record.push(title);
 record.push(stime);
 record.push(etime);
 record.push(time);
 sheet.appendRow(record);
 }}
```

###独自のアプリケーション作成にチャレンジ
これで基本的なGAS操作の紹介終了となりますが、もっとコードを綺麗に書いたり、ほかの関数を使ってコード書くことでより深くGASについて知ることができます。
実務で使えるようになるには実務をこなすしかありませんので、案件獲得に向けて日々精進したいと思います。