【0からGASを学ぶ】GASからGoogleの各種サービスにアクセスしてみよう

# はじめに
本シリーズでは、GASの始め方や便利な使い方、ビジネス活用まで幅広く解説します。シリーズをひと通り読んでいただければ、あなたもきっとGASマスターになれるはずです。

# シリーズの対象者
* そもそもGASってなんだか**わからない**方
* GASを学びたいけど**何から始めればいいか**わからない方
* GASはわかり始めたけど、**もっと活用ができないか**と模索している方
* とにかく**Googleが好き！** という方

# 前回記事
https://qiita.com/gas-suke/items/5cf7bd4c6c3f15a25838

# GASからサービスを操作する
では早速始めていきましょう。【0からGASを学ぶ】シリーズの第2回は「GASからGoogleの各種サービスにアクセスしてみよう」です。

## GASからアクセス
[前回](https://qiita.com/gas-suke/items/5cf7bd4c6c3f15a25838)はGASエディタを開くまでやりました。今回はそのエディタ上にプログラムを記述して、**Googleの各種サービスを操作**してみましょう。とは言ってもちょっと操作するくらいです、**複雑なことはまた次回以降**に！
なお、単純にアクセスするだけならばコンテナバインド型の方が簡単ですが、**あえてスタンドアロン型**でやってみましょう。**複数サービスを同一のGASから操作**する場合は、**自ずとスタンドアロン型の記述**が必要となります。

:::note info
スタンドアロン型とコンテナバインド型の違いは[こちら](https://qiita.com/gas-suke/items/5cf7bd4c6c3f15a25838#%E3%81%A7%E3%81%AF%E8%A9%A6%E3%81%97%E3%81%ABgas%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%82%92%E9%96%8B%E3%81%84%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%82%87%E3%81%86)から
:::

### 事前準備
今回は、`Googleスプレッドシート`、`Googleドキュメント`、`Googleスライド`、`Googleフォーム`それぞれにアクセスしますので、以下のような状態を作ってください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/c2ed0797-cb8d-7803-db8a-f8cd14fe4c79.png" width="300"/>

:::note info
新規に各種サービスを作成する場合、**サービスを開いたあとに適当な入力**を一度でもすれば、ヘッダー部の表示が変わり、Googleドライブへの保存が完了します。自動保存は本当に便利です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/7dc60dbd-dfe5-ada2-c3f0-bfd70f61a7f1.png" width="500"/>
　↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/83a48666-6892-c092-0693-888fc64248ec.png" width="500"/>
:::

:::note warn
スタンドアロン型でアクセスする場合は、**各種サービスとGASが紐づいていない**ため、予め各種サービスを作成しておく必要があります。
※すでにアクセスしたいファイルが決まっている場合は新規に作成する必要はありません。
:::


### 各ファイルのIDを取得
`Googleスプレッドシート`、`Googleドキュメント`、`Googleスライド`、`Googleフォーム`にはそれぞれに**一意なID（文字、数字、ハイフン、アンダースコアから成る一意の値）が割り振られています**。この一意のIDはファイルのURLから確認できますので、それを**取得（コピー）** しておいてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/f3e8ce18-5fef-9333-e48f-eaf7ac91b39d.png" width="800"/>
※この例でいうと、四角で囲った`1xjdjN2uJefWlyN87SScPsnahWJ_NEVEuHiDxxBElPdU`がIDとなります。

### GASエディタを開く
繰り返しになりますが、今回はスタンドアロン型で開きますので、[こちら](https://qiita.com/gas-suke/items/5cf7bd4c6c3f15a25838#%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89%E3%82%A2%E3%83%AD%E3%83%B3%E5%9E%8B)を参考にGASエディタを起動してください。では、どんどんいきますよ、ついてきてください。

### Googleスプレッドシート編
```javascript:SpreadSheet.gs
function Qiita002_SpreadSheet() {
  // スプレッドシートクラスを用いて、IDを指定してファイルにアクセスする
  let wSpread = SpreadsheetApp.openById('1xjdjN2uJefWlyN87SScPsnahWJ_NEVEuHiDxxBElPdU');
  // 対象スプレッドシートの1番目のシートにアクセスする
  let wSheet = wSpread.getSheets()[0];
  // "シート1"にアクセスする場合など名称確定の場合は、以下でもOK
  // let wSheet = wSpread.getSheetByName('シート1');

  // 試しにC2セル（2行3列目）にQiitaと入力する
  wSheet.getRange(2, 3).setValue('Qiita');
}
```
上記のプログラムを実行すると、対象のスプレッドシートのC2セルに**Qiita**と出力されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/01539086-370f-174f-4708-ee9c16ae969d.png" width="600"/>

:::note warn
GASは[実行]ボタンをクリックした際に、各クラスに対するアクセス権限がまだ承認されていない場合、それを促すダイアログが表示されます。これは、GASも自身のアカウントで作成しているとはいえ、GASから見ると別のGoogleサービスを扱うことになるため、本当によいかどうかを確認するものとなります。か各種サービスにアクセスすることに問題なければ、以下に従って権限を与えてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/21ee12e0-6aaa-2ef1-f6cb-e92590fe6590.png" width="400"/>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/8b7cd1e1-47f3-b249-ac29-5d63e09d7cfd.png" width="400"/>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/e47cd7ca-67f0-a1f5-ba8e-d931a5f03f64.png" width="400"/>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/c3a21b93-9846-c13f-d70c-ba1e0086a4e4.png" width="400"/>
:::

### Googleドキュメント編
```javascript:Document.gs
function Qiita002_Document() {
  // ドキュメントクラスを用いて、IDを指定してファイルにアクセスする
  let wDocument = DocumentApp.openById('1cb8sBXasR2WFmx_o5FvCNJJ48fP8Gm-tU7gk7-RUGnE');
  // 試しに、対象ドキュメントに段落を追加してQiitaと入力する
  wDocument.getBody().appendParagraph('Qiita');
}
```
上記のプログラムを実行すると、対象ドキュメントに**Qiita**と出力されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/a5710fa6-cca0-8c24-52ad-38d3ddb60264.png" width="400"/>

### Googleスライド編
```javascript:Slide.gs
function Qiita002_Slide() {
  // スライドクラスを用いて、IDを指定してファイルにアクセスする
  let wSlides = SlidesApp.openById('1y0GdnbOrb6emJTm1bT-uCT-mqUyQobNu_HC189MH-LQ');
  // スライドの1ページ目を取得する
  let wSlide = wSlides.getSlides()[0];
  // 試しに1ページ目に設定されているテキストボックスや図形オブジェクトの数を取得する
  console.log(wSlide.getShapes().length);
  // 1ページ目の1つ目のオブジェクトにQiitaと設定する
  wSlide.getShapes()[0].getText().setText('Qiita');
}
```
上記のプログラムを実行すると、対象スライドの1スライド目のタイトルに**Qiita**と出力されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/91057d32-1acc-3f1f-dd7c-6dac49e18e77.png" width="400"/>

### Googleフォーム編
```javascript:Form.gs
function Qiita002_Form() {
  // フォームクラスを用いて、IDを指定してファイルにアクセスする
  let wForm = FormApp.openById('15cpfIgLpqWnE2tK7gNlCAarNPFYnePNOXFPfsWlhKLU');
  // フォームに'Qiitaについてどう思うか'の質問文を追加する
  wForm.addParagraphTextItem().setTitle('Qiitaについてどう思いますか')
                              .setRequired(true)
                              .setHelpText('できるだけ詳しく記載して下さい');
}
```
上記のプログラムを実行すると、対象フォームに質問「Qiitaについてどう思いますか」がテキスト形式の必須回答項目として追加されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/2563dce9-e118-68ba-d898-faa3c1143ebb.png" width="600"/>

### これらをコンテナバインド型で記述すると？
以下は**各種サービスからGASエディタを開いたと仮定した場合の記述**になります。そのため、例えば`Qiita002_BindingSpreadSheet`メソッドを、**Googleドキュメントから開いたGASで実行**しても実行エラーが発生します。

```javascript:Binding.gs
function Qiita002_BindingSpreadSheet() {
  // バインディングしているスプレッドシートを取得する
  let wSpread = SpreadsheetApp.getActiveSpreadsheet();
  // 対象スプレッドシートの1番目のシートにアクセスする
  let wSheet = wSpread.getSheets()[0];
  // "シート1"にアクセスする場合など名称確定の場合は、以下でもOK
  // let wSheet = wSpread.getSheetByName('シート1');

  // 試しにC2セル（2行3列目）にQiitaと入力する
  wSheet.getRange(2, 3).setValue('Qiita');
}

function Qiita002_BindingDocument() {
  // バインディングしているドキュメントを取得する
  let wDocument = DocumentApp.getActiveDocument();
  // 試しに、対象ドキュメントに段落を追加してQiitaと入力する
  wDocument.getBody().appendParagraph('Qiita');
}

function Qiita002_BindingSlide() {
  // バインディングしているスライドを取得する
  let wSlides = SlidesApp.getActivePresentation();
  // スライドの1ページ目を取得する
  let wSlide = wSlides.getSlides()[0];
  // 試しに1ページ目に設定されているテキストボックスや図形オブジェクトの数を取得する
  console.log(wSlide.getShapes().length);
  // 1ページ目の1つ目のオブジェクトにQiitaと設定する
  wSlide.getShapes()[0].getText().setText('Qiita');
}


function Qiita002_BindingForm() {
  // バインディングしているフォームを取得する
  let wForm = FormApp.getActiveForm();
  // フォームに'Qiitaについてどう思うか'の質問文を追加する
  wForm.addParagraphTextItem().setTitle('Qiitaについてどう思いますか')
                              .setRequired(true)
                              .setHelpText('できるだけ詳しく記載して下さい');
}
```

### 各クラスのリファレンス
今回アクセスした`Googleスプレッドシート`、`Googleドキュメント`、`Googleスライド`、`Googleフォーム`について、簡単な操作方法を示しました。次回以降では各クラス（特によく使われる**Googleスプレッドシート**と**Googleフォーム**を重点的）の詳細な活用方法をどんどん記載していきますが、少しでも**予習しておきたい方**は以下から各クラスのリファレンスを学んでみてください。
#### SpreadsheetApp
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app?hl=ja
#### DocumentApp
https://developers.google.com/apps-script/reference/document/document-app?hl=ja
#### SlidesApp
https://developers.google.com/apps-script/reference/slides/slides-app?hl=ja
#### FormApp
https://developers.google.com/apps-script/reference/forms/form-app?hl=ja

:::note info
安心してください。こーゆーリファレンスが**苦手な人**でも本シリーズを読み続けていただければ、必ず**GASマスターに近づけます**。
:::

### コンテナバインドの存在しないサービス
GASでプログラムを書いていると頻繁に使用するものの、コンテナバインド型が存在しないサービスもいくつかあります。代表的なものでいうと`Googleカレンダー`、`Googleドライブ`、`Gmail`の3つです。これらの簡単な使い方は次回にしましょう。

# おわりに
お疲れ様でした。
第2回は「GASからGoogleの各種サービスにアクセスしてみよう」ということで、**少しだけですがGASに触れることができたのではないでしょうか**。まだまだ序盤なので、長い道のりに感じるかもしれません。しかしながらすべてはここからです。まずは**GASで各種サービスにアクセスをする**、そして**データを取得**したり、**編集**したり、**データに応じて別サービスを動かしたり**など、やりたいことを想像しながら学んでいきましょう。
記事を読んで、「良いな」や「今後に期待できる！」と感じて頂けたら**いいね**や**フォロー**、**コメント**いただけると幸いです。それではまた次回をお楽しみに！

## ブログでより詳しく解説しています！
以下画像をクリックしてブログにアクセス！！
<a href="https://gas-4u.com/gas02/" target="_blank"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575702/9cf94def-3c44-d009-a32f-bfd2ada4b35d.png" width="600"/></a>