2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

Googleフォームに回答してくれた人のメーリングリスト的なものを作る

Last updated at Posted at 2024-01-27

はじめに

イベントごとにGoogleフォームで参加者を募集し、回答してくれた人にだけ追加のメールを送りたい(=イベントごとにメーリングリスト的なものが作りたい)ときに使える仕組みを作りました。

参考ページ

連絡先取得~連絡先登録・更新部分はほどんど「officeの社」さんのソースを使用させていただいています。

使用するサービス

  1. Googleフォーム
  2. GooGle Apps Script(GAS)
  3. Google連絡先
  4. Gmail

手順

  1. イベント募集用のGoogleフォームを作成する
  2. GoogleフォームにGAS・トリガーを設定する
  3. Gmailの宛先にラベルを指定

前提

  • Googleアカウントが作成済みであること
  • PCで作業すること

1.イベント募集用のGoogleフォームを作成する

  1. Googleフォームにアクセス(https://www.google.com/intl/ja_jp/forms/about/)
    「ログイン」ボタンをクリックし、画面の案内に従ってログインしてください。
    image.png

  2. Googleフォームのトップページで「空白のフォーム」をクリック
    image.png

  3. 回答を自動返信するように設定(任意)
    「設定」タブをクリック
    image.png
    「回答」項目の横のボタンをクリックし内容を展開
    メールアドレスを収集する:確認済み
    回答のコピーを回答者に送信:常に表示
    image.png

  4. フォームのタイトル、質問項目を作設定
    タイトル:後ほど使用する連絡先のグループ名になります。
    メールアドレス、氏名を記述式・必須入力で設定します。
    image.png
    他の質問項目は今回の処理には特に関係ないので自由に設定してください。

2.GoogleフォームにGAS・トリガーを設定する

  1. 画面右上の三点マークをクリックし、「スクリプト エディタ」をクリック
    image.png

  2. プロジェクトの設定
    image.png

  3. 「appsscript.json」マニフェスト ファイルをエディタで表示する のチェックボックスをONにする
    image.png

  4. コードをクリック
    image.png

  5. 「appsscript.json」をクリックし、以下をコピペ

      {
          "timeZone": "Asia/Tokyo",
          "dependencies": {
              "enabledAdvancedServices": [
                  {
                  "userSymbol": "People",
                  "version": "v1",
                  "serviceId": "peopleapi"
                  }
              ]
          },
          "exceptionLogging": "STACKDRIVER",
          "runtimeVersion": "V8",
          "oauthScopes": [
              "https://www.googleapis.com/auth/contacts",
              "https://www.googleapis.com/auth/forms",
              "https://www.googleapis.com/auth/userinfo.profile"
          ]
      }
    
  6. コード.gsに以下をコピペ

    function onFormSubmit(e) {
    try{
    // フォームの回答からメールアドレスを取得
      var itemResponses = e.response.getItemResponses();
      var userEmail = itemResponses[0].getResponse();  //1つ目の質問の回答
      var userName = itemResponses[1].getResponse();  // 2つ目の質問の回答
      var labelFromTitle = e.source.getTitle();  // フォームのタイトルを取得
    
      //現在の連絡先一覧を一括取得
      let array = personskun();
    
      //追加フラグを用意
      let addflg = true;
    
      //array(連絡先一覧)でループし、フォームに登録されたメアドが既に連絡先にあれば更新、なければ新規追加
      for(let j = 0; j<array.length; j++){
        //レコードを一個取り出す
        let recs = array[j];
    
        //メールアドレスを取得
        let tempmail = recs[0];
    
        //フォームに登録されたメアドが既に連絡先にあれば更新
        if(tempmail == userEmail){
          console.log("連絡先更新")
          //etagを取得
          let person = recs[1];
          // ラベルアップデート
          modifyContact(person, labelFromTitle)
          //追加フラグを変更
            addflg = false;
          }
        }
        //フォームに登録されたメアドと連絡先に一致するものがなければ新規追加
        if(addflg == true){
          //ラベル指定で連絡先を新規追加
          console.log("連絡先新規追加")
          var contactResourceName = createContact(userName, userEmail);
          modifyContact(contactResourceName, labelFromTitle)
        }
    }catch(e){
      console.log(e.message);
    }
    }
    
    
    //連絡先を作成する
    function createContact(username, mail) {
    //usernameを半角スペースで分解する
    let userman = username.split(" ");
    if (userman.length < 2){
      userman.push("")
    }
    
    //作成するリソースの中身
    var contactResource = {
      "names": [{
        "displayNameLastFirst": username,
        "givenName": userman[1],
        "familyName": userman[0],
      }],
      "emailAddresses": [{
        'value': mail
      }]
    }
    var contactResourceName = People.People.createContact(contactResource)["resourceName"];
    console.log("連絡先を新規作成しました。")
    
    return contactResourceName; 
    }
    
    
    // 連絡先を更新 コンタクトグループ(ラベル)を作成、設定
    function modifyContact(person, label) { 
    console.log("コンタクトグループ(ラベル)を作成、設定します。")
    var groupName = label;
    var groups = People.ContactGroups.list()["contactGroups"];
    var target_group = groups.find(group => group["name"] === groupName);
    //グループ名が無い場合には作成する
    if (!target_group ) {
      var groupResource = {
        contactGroup: {
          name: groupName
        }
      }
      group = People.ContactGroups.create(groupResource);
    }else{
      group = target_group
    }
    var groupResourceName = group["resourceName"];
    
    if (person != ""){
        const { etag, memberships } = People.People.get(person, { personFields: "memberships" });
        return People.People.updateContact({
          "resourceName": person,
          "etag": etag,
          "memberships": [
            ...memberships, // Here, the existing labels are included.
            { "contactGroupMembership": { "contactGroupResourceName": groupResourceName } }
          ]
        },
          person,
          { updatePersonFields: "memberships" });
    }
    }
    
    
    //連絡帳の一覧を取得する
    function personskun(){
    //pageTokenの変数
    let pageToken = null
    
    //一覧用の配列
    let array = [];
    
    do{
      //一覧を取得
      let people = People.People.Connections.list('people/me', {
          personFields: 'emailAddresses',
          pageSize: 500,
          pageToken: pageToken
      });
    
      //リストを取得する
      let target = people.connections;
    
      //連絡先が0件の場合
      if(target == undefined){
        return array;
      }
    
      //ターゲットデータを処理する
      for(var i = 0;i<target.length;i++){
        //レコードを取り出す
        let rec = target[i];
    
        //一時配列を用意
        let temparr = [];
    
        //emailAddressesが無い場合はスルーする
        let mailaddress = ""
        try{
          mailaddress = rec.emailAddresses[0].value
        }catch(e){
          mailaddress = ""
        }
    
        //一覧から必要な項目を取得する
        temparr.push(mailaddress);
        temparr.push(rec.resourceName);
        temparr.push(rec.etag);
    
    
        //一覧用配列に追加
        array.push(temparr);
      }
    
      //nextPageTokenを取得する
      pageToken = people.nextPageToken
    
    }while(pageToken !== undefined);
    
    //一覧データを返す
    return array
    }
    
  7. トリガーを設定
    ナビゲーションで「トリガー」をクリックし、右下の「トリガーを追加」をクリック
    image.png
    基本デフォルトで、以下を設定して保存
    イベントの種類を選択:フォーム送信時
    image.png
    サブウィンドウが表示されるので、自分のGoogleアカウントをクリック
    image.png
    警告画面が表示されるので、左下の「Advanced」をクリック
    image.png
    さらに表示される「Go to 無題のプロジェクト(unsafe)」をクリック
    image.png
    「Continue」をクリック
    image.png
    「Allow」をクリック
    image.png
    トリガーが追加されます。
    image.png

  8. Googleフォームに回答
    アンケート画面に戻り、画面右上の「送信」をクリック
    URLを共有したい場合はリンクをコピー
    image.png

3.Gmailの宛先にラベルを指定

Gmailでメール新規作成
宛先(CC・BCC)にラベル名を入力するとサジェストしてくれる
image.png
ラベル名をクリックすると、宛先にメンバーが追加されます!

おまけ

ラベルはGoogle連絡先に保存されます。(ここからメール作成することも可能です。)
image.png

おわりに

スマホのGmailからラベルが直接選択できれば便利なのですが、どうやら2024年1月現在そのような使いかたはできないみたいです。

Google Formでは回答がスプレッドシートに自動的に保存されていくため、それをコピペして宛先に貼り付ければいいだけですが、勉強がてら作成しました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?