【GAS】GoogleAppsScriptとGoolgleフォームで自己紹介スライドを自動作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529795/04967afc-f9f6-a23c-aed4-85028509b59d.png)
こんにちは！
日々の学びをアウトプットしていく場にしたいと思い投稿させていただきます。

コロナ渦で、オンラインでのイベントや、何かとオンライン上で、自己紹介をする機会が多いですよね。
最近GoogleAppsScriptを学び始め、身近な事例を効率化したいと思い、開発しました。

今回作成したのは、googleフォームに入力した自己紹介内容を、自動でスライド生成するというものになります。
※記念すべきQiita初投稿になります！

#実際の動作
<iframe width="560" height="315" src="https://www.youtube.com/embed/k5mrYSMqq10" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
※音声無になります。
#下準備
##スプレッドシートの作成
スプレッドシートを作成し、「ツール」→「フォームを作成」で、自己紹介の項目をフォーム上で作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529795/f54a7e34-f480-a57f-3301-f14f39d0a24d.png)
##フォームの作成
フォームを作成し、自己紹介の入力ができるようにします。
項目はスライドと連動するので、スライドに記載していく項目を準備します。
![スクリーンショット 2021-03-14 21.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529795/dcabbf24-1bba-d83b-aabd-07286fecb922.png)
##回答内容の確認
フォームに回答が完了後、「フォームの回答」というシートができているので、回答内容がスプレッドシートに記録されていることを確認します。
またこの時にスプレッドシートを共有状態にしてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529795/ea8cfe9b-a986-e6af-3693-339400fa2292.png)
※デモとして「アンパンマン」の自己紹介をフォームに回答しました。
##スライドの作成
googleスライドでテンプレートスライドを作成します。
このスライドの文字を、フォームの回答内容と置き換えるので、反映させたい項目をレイアウトしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529795/72db4085-c4a9-26ee-0dce-2a2c2f4a8151.png)
この場合も、スライドは共有設定でお願いします。
${}内の文字を置換えていくコードを、GASで書いていきます。

スライドの自己紹介項目は、下記記事を参考にして、「オンラインイベント」をイメージして記載しました。
目的に応じて、項目を変えていきます。
#ソースコード

```code.gas
function generateSlidesFromSpreadsheet() {
  //ここにスプレッドシートのURLを記載
  var sheet = SpreadsheetApp.openByUrl('**********************').getSheetByName('***************');
  //ここにスライドのURLを記載
  var slide = SlidesApp.openByUrl('***************');
 
  var datarange = sheet.getDataRange().getValues();
  var template = slide.getSlides()[1];
  
  //スプレッドシートの最終行を返すコード
  var lastRow = sheet.getLastRow();
  
  //新しいスライドを追加するコード
  var newpage = slide.appendSlide(template);

  //最終行の各セルをfor文で取得し、スライドテンプレートの${}と置換え
  for(var j=0;j<datarange[0].length;j++){
    newpage.replaceAllText('{'+datarange[0][j]+'}', datarange[lastRow-1][j]);
  }

  //アップロードされた画像をスライドの画像と置換え
  var image = datarange[lastRow-1][3].replace('open?','uc?export=view&');
  try{
    newpage.getImages()[0].replace(image);
  }catch(e){
    Logger.log(image);
  }

}
```

#トリガー設定の例
フォームを送信したら、関数を実行するという設定になります。
これは一例にになりますが、

実行する関数：generateSlidesFromSpreadsheet
デプロイ時に実行：Head
イベントのソース：スプレッドシートから
イベントの種類を洗濯:フォーム送信時

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529795/4edb13d5-299a-f063-53c0-0fe7e8efb259.png)
#Googleスライドに出力された結果の確認
Googleフォームに記載された内容が取得出来ていることが分かります。
今回はトリガーから実行し、「フォームを記載完了後スライドを生成」としていますが、トリガーではなく、GASのエディタ→実行からまとめて取得するようなコードにすることも可能です。（※下記参考記事参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529795/24d3aa65-4a8b-f61a-3ee6-baf8930d73cd.png)
アンパンマンのプロフィールシートを取得出来ました！
（1歳8ヶ月の息子が「ぱんまん！！」と喜んでました笑）
#はまったエラー
時間がかかったのが、下記のエラーです。

・文字は置換えられるが、画像は置換えられない場合がある

→解決したのは、「共有設定」でした。

スライドの共有設定を「共有」にするのと、プロフィール画像が自動的に自身のワンドライブフォルダ内にアップロードされるので、そのファイルが「共有」になっているかどうかの確認をお願いします。
![スクリーンショット 2021-03-14 21.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529795/96853d68-30bf-b829-fd48-37d009812031.png)
#最後に
GASを学び始めて、1週間でのアウトプットを恐縮ながら投稿させていただきました。
今まで数々のエラーの際にQiitaを参考に解決してきました。
今回始めてのQiita投稿になります。
至らない点があるかもしれませんが、是非ご覧いただけると幸いです。

#参考記事

https://qiita.com/erb_owl/items/5fb3ba083c4fad0a548c

http://www.nowhere.co.jp/blog/archives/20200911-070040.html