Google SlidesをGoogle Apps Scriptからいじる

この記事は[WACULアドベントカレンダー](https://qiita.com/advent-calendar/2017/wacul)の15日目の記事です。


#はじめに
こんにちは。私はプログラマではないのですが、業務の都合プログラムを勉強しています。ひょんなことからアドベントカレンダーに誘われたので、初めて記事というものを書いています。

今回とりあげるのは[Google Slides](https://developers.google.com/slides/how-tos/overview)です。
このテーマについて書いた記事が少なく手探り状態ですので、何卒ご容赦ください。

以下のサンプル1ページのみのプレゼンテーションを例として使用します。

### 今回使用するサンプルスライド
<img src="https://qiita-image-store.s3.amazonaws.com/0/139443/8b175266-bfcc-cb9e-7cfc-9310f1dcb374.png" width=80% height=80%>

# この記事のゴール

もともとは、パワポ資料作成に非常に時間がかかるものを何か自動化できないか、というところから出発しました。そのため今回は、

- テンプレートからの値取得
- 中身のテキストを書き換える

をゴールに書いていきます。

# サンプルコード
## テキストボックスの中身を置き換える

### 概要

- プレゼンテーション1ページ目のスライドを取得
- スライドの要素をすべて取得し、for文で1つずつチェック
- テキストボックスは`shape`なので、`shape`のオブジェクトにつき中身のテキストを取得
- テキストが`SampleText`のものについて、テキストを削除した上で、`Replaced Text`を挿入

### サンプルコード

```javascript
function updateShape() {
  var presentationID = "abcdefghijklmnopqrstuvwxyz0123456789"
//  プレゼンテーションIDを指定し、プレゼンテーションを取得
  var presentation = Slides.Presentations.get(presentationID)
//  1ページ目のスライドを取得
  var slide = presentation.slides[0]
//  ページの要素を取得する
  var pageElements = slide["pageElements"]

  for(var i =0;i<pageElements.length;i++){
//    ページ要素を取得
    var element = pageElements[i]
//    オブジェクトのIDを取得
    var objectId = pageElements[i]["objectId"]
    if("shape" in element){
//      テキストボックスを取得
      var shape = element["shape"]
//      中身のテキストを取得
      var content = shape["text"]["textElements"][1]["textRun"]["content"]
      
      if(content=="SampleText"){
        var text = "Replaced Text"
        var requests=[
//          テキスト削除リクエスト
          {
            "deleteText":{
              "objectId":objectId,
              "textRange":{
                "type":"ALL"
              }
            },
          },
//          テキスト挿入リクエスト
          {
            "insertText":{
              "objectId":objectId,
              "text":text,
              "insertionIndex":0
            }
          }
          
        ]
        Slides.Presentations.batchUpdate({"requests":requests},presentationID)
      }
    }
  }
}
```



## 表の値を更新する

### 概要

- プレゼンテーション1ページ目のスライドを取得
- スライドの要素をすべて取得し、for文で1つずつチェック
- 表は`table`なので、`table`のオブジェクトを取得
- セルの位置を指定し（サンプルスライドの `A` の部分）中身のテキストを取得
- `A`を削除し、`AAAAA`を挿入

### サンプルコード
```javascript
function updateTable() {
  var presentationID = "abcdefghijklmnopqrstuvwxyz0123456789"
//  プレゼンテーションIDを指定し、プレゼンテーションを取得
  var presentation = Slides.Presentations.get(presentationID)
//  1ページ目のスライドを取得
  var slide = presentation.slides[0]
//  ページの要素を取得する
  var pageElements = slide["pageElements"]
  
  for(var i =0;i<pageElements.length;i++){
//    ページ要素を取得
    var element = pageElements[i]
//    オブジェクトのIDを取得
    var objectId = pageElements[i]["objectId"]
    
    if("table"in element){
      var table =element["table"]
//      置き換えるセルの行、列を指定
      var rowIndex = 1
      var columnIndex = 1
//      指定したセルのテキストを取得
      var content = table["tableRows"][0]["tableCells"][rowIndex]["text"]["textElements"][columnIndex]["textRun"]["content"]
      
      var text = "AAAAA"
      var requests=[
        {
          "deleteText":{
            "objectId":objectId,
            "cellLocation":{
              "rowIndex":rowIndex,
              "columnIndex":columnIndex
            },
            "textRange":{
              "type":"ALL"
            }
          },
        },{
          "insertText":{
            "objectId":objectId,
            "cellLocation":{
              "rowIndex":rowIndex,
              "columnIndex":columnIndex
            },
            "text":text,
            "insertionIndex":0
          }
        }
      ]
      Slides.Presentations.batchUpdate({"requests":requests},presentationID)
    }
  }
}

```

# まとめ
結局のところ、とりあえずデータを取得してみて、ログを出してそれを読み解きはじめたあたりから進捗が生まれてきたなという感じです。いい勉強になりました。

私にとっては今回の記事は十分に成果といえるところです。パワポ自動化を急かされているので、パワポ作成を自動化すべくもう少し頑張ります。