Vue.jsとGoogleFormを連携し、送信完了後の画面遷移先を変更する方法

## はじめに
ポートフォリオに実装したい問い合わせフォームの画面遷移に苦戦し、数日間という貴重な時間を溶かしてしまった為、今後の初学者の方に向けて参考になればと思い記録を残しておく。

## 作るもの
Vue.jsで問い合わせフォームを実装し、送信完了後にGoogleFormのデフォルトの送信完了画面ではなく自作のコンポーネントへ画面遷移させたい。

## GoogleFormのエントリーコードをVue.jsのコードに組み込んだ際の動作

[こちらの記事を参考にフォームを作成しました](https://qiita.com/sotatakahashi/items/fa077cbf820faca30598)

フォームに入力し、
![スクリーンショット 2023-04-25 11.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2381545/c2d11ea2-38ba-d535-3285-62fc90af2fe2.png)

送信をすると以下の画面が表示。
![スクリーンショット 2023-04-25 11.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2381545/dd0f4456-ce05-c001-a9f1-ecdd8df6f80c.png)

エントリーコードを組み込むだけでは送信完了後にデフォルトの送信完了画面へ遷移してしまう...

## 解決方法
@submit.preventディレクティブを使用する。
フォームが送信されたときにデフォルトの動作をキャンセルし、送信が成功した場合、Vueルーターを使用してコンポーネントへリダイレクトさせる。

## 全体のコード
```vuejs:Contact.vue
<script>
export default {
  data() {
    return {
      name: "",
      email: "",
      content: "",
    };
  },
  methods: {
    async submitForm() {
      const formId = "XXXXX";
      const formData = new FormData();
      formData.append("entry.XXXXX", this.name);
      formData.append("entry.XXXXX", this.email);
      formData.append("entry.XXXXX", this.content);
      await fetch(`https://docs.google.com/forms/d/e/${formId}/formResponse`, {
        method: "POST",
        mode: "no-cors",
        body: formData,
      });
      this.$router.push("/ContactComplete");
    },
  },
};
</script>

<template>
  <div class="contact">
    <h1>Contact</h1>

    <form @submit.prevent="submitForm">
      <label for="name">氏名</label>
      <input type="text" name="entry.XXXXX" v-model="name" />

      <label for="email">メールアドレス</label>
      <input type="email" name="entry.XXXXX" v-model="email" />

      <label for="content">本文</label>
      <textarea name="entry.XXXXX" v-model="content"></textarea>

      <button type="submit" name="button" value="送信">送信</button>
    </form>
  </div>
</template>

<style lang="scss">
.contact {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100vh;
  color: #c8d1d9;

  form {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;

    label {
      display: block;
      margin: 10px 0;
    }

    input[type="text"],
    input[type="email"],
    textarea {
      margin-bottom: 20px;
      padding: 4px;
      border: 1px solid #ccc;
      border-radius: 4px;
      font-size: 16px;
      width: 280px;
    }

    textarea {
      height: 200px;
      resize: vertical;
      min-height: 100px;
    }

    button[type="submit"] {
      background-color: #007bff;
      color: #fff;
      padding: 10px 20px;
      border: none;
      border-radius: 4px;
      font-size: 16px;
      cursor: pointer;
    }
  }
}
</style>
```

## 解説
```vuejs:Contact.vue
data() {
    return {
      name: "",
      email: "",
      content: "",
    };
  },
```
まずはdataオプションにフォームの値を格納するためのname、email、contentの3つの空の文字列を定義。

```vuejs:Contact.vue
methods: {
    async submitForm() {
      const formId = "XXXXX";
      const formData = new FormData();
      formData.append("entry.XXXXX", this.name);
      formData.append("entry.XXXXX", this.email);
      formData.append("entry.XXXXX", this.content);
      await fetch(`https://docs.google.com/forms/d/e/${formId}/formResponse`, {
        method: "POST",
        mode: "no-cors",
        body: formData,
      });
      this.$router.push("/ContactComplete");
    },
  },
```
methodsオプションには、GoogleFormにデータを送信するsubmitFormメソッドを定義。
submitFormメソッドは、GoogleFormのformIDを取得し、formDataオブジェクトを使用してフォームの入力値を格納。
その後、fetch関数を使用して、フォームの送信先のURLにリクエストを送信。
modeオプションはno-corsに設定し、クロスオリジンリクエストを送信することを可能にする。
送信が成功した場合、Vueルーターを使用してあらかじめ設定した送信完了画面（この場合'/ContactComplete')にリダイレクトする。

```vuejs:Contact.vue
    <form @submit.prevent="submitForm">
```
formタグに@submit.preventディレクティブを使用。
送信された際にデフォルトの動作をキャンセルし、送信が成功した場合、Vueルーターを使用してコンポーネントへリダイレクトさせる。

### 動作確認
![contact.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2381545/fce47688-8cd2-bb70-90dd-820f5a25b326.gif)
無事に画面遷移完了！
GoogleFormへの送信も問題なし。

## おわりに
問い合わせフォームを手軽に導入できると思い、GoogleFormを選択したが思わぬところではまってしまった。
サーバーサイドの知識をつけて、次にフォームを作る際はPHPを使用して作ってみたい。

## 参考記事
[Googleフォームを自在にカスタマイズする
](https://qiita.com/sotatakahashi/items/fa077cbf820faca30598)
[Qiitaに動画を埋め込む方法。Macデスクトップで動画作成後GIF化するまでの手順詳細](https://qiita.com/shizen-shin/items/5fb258da165235722e4c)