cybozu developer network

カテゴリー内の他の記事

Google フォームとkintoneを連携してみよう!

(Author : Fuji Business International Mamoru Fujinoki)

はじめに

アンケートやイベントの出欠など Google フォーム を使うと容易に作成、送信が出来ます。今回は、Google Apps Script を使って、その回答を素早くkintoneに登録してみたいと思います。

1. 事前に必要なもの

  • Googleアカウント
  • kintoneアカウント ※開発者ライセンスの取得方法はこちら

2. 開発の流れ

  • Googleフォームの作成
  • kintoneアプリの作成
  • Google Apps Scriptによるプログラムの作成

以上の手順で開発して行きます。

3. Googleフォームの作成

Step 1

Google アカウントにログイン後、右トップメニューのGoogleアプリアイコンより、Googleフォームを選択し(または、https://docs.google.com/forms/ から直接ログイン)、「新しいフォームを作成」の「+」サインをクリックします。

001.png

Step 2

Googleフォームの作成画面が表示されるので、フォームのタイトル、フォームの詳細を以下の例のように入力します。
例:
[フォーム名]
Kintone Connect-to-Play LA Vol.1 −Cybozu サイボウズ−
[フォームの説明・詳細等]
Date: 7/13/2017, 6:30 PM - 9:00 PM
Event Address: 21515 Hawthorne Boulevard, Torrance, CA, 90503, US

002.png

Step 3

設定アイコンをクリックして、「メールアドレスを収集する」をチェックし、変更を保存します。

003.png

Step 4

次に「無題の質問」について、メニューより質問のタイプとして「ラジオボタン」を選択し、質問欄に質問を入力、回答の選択肢を以下のように入力します。
※記号[?]は半角で入力してください。

[質問]参加しますか?
[解答例]
• はい、参加します
• いいえ、参加できません

004.png


回答を必須にしたい場合、以下のように「必須」を選択します。

005.png

Step 5

以下の画像を参考に質問を追加します。

  • [タイプ]記述式、[質問]参加人数、[必須選択]
  • [タイプ]段落、[質問]参加者の名前を記入してください

006.png

 

以上でGoogleフォームの完成です。

4. kintoneアプリの作成

Step 6

kintoneのアプリ作成画面より、「はじめから作成」を選択し、以下の画像を参考にフォームにフィールドを追加します。

010.png

 

フィールドの種類 フィールド名 フィールドコード
リンク(入力値の種類:メールアドレス) メールアドレス Email
ラジオボタン 参加しますか? attend
数値 参加人数 number_of_attendee
文字列(複数行) 参加者名 name_of_attendee

Step 7

次にアプリの設定画面より、「APIトークン」を作成します。

008.png

「APIトークン」設定画面より、「生成する」ボタンをクリックし、「アクセス権」に「レコード追加」をチェックして「保存」します。

009.png

 

アプリの設定画面に戻ったら、「アプリを公開」をクリックして、作成したアプリを公開します。

011.png

 

以上で、アプリの完成です。

5. プログラムの作成

Step 8

上記で作成したGoogleフォームを再び開き、「その他」メニューから「スクリプトエディタ」をクリックします。

012.png

 

以下の画面が開くので、プロジェクト名、ファイル名を入力します。

013.png

Step 9

kintone API呼び出しのライブラリが公開されているので、今回はこれを利用させていただきます。
Qiita Tip: kintone とGoogle Apps Script連携

「ライブラリを追加」をクリックします。
Google Apps Script Library for kintone の README.md にある「Script ID (For New editor)」の値を「スクリプト ID」欄に入力し、「検索」ボタンでライブラリを検索します。
ライブラリが表示されたら、最新のバージョンを選択し、「追加」をクリックします。

script_id.png

Step 10

manifestファイルに、OAuth scope を記載します。

 プロジェクトの設定ボタンから[「appsscript.json」マニフェスト ファイルをエディタで表示する]にチェックを入れます。

015.png

 

 エディタに戻り、appsscript.json に、下記のようにOAuth scopeを追加します。

最後の要素に追記する場合には、末尾のカンマ(,)は不要です。

016.png

Step 11

下記を参考にコーディングします。

コーディング終了後、保存します。

 

【解説】

[Google フォームの回答を取得]

以下のAPI関数で、フォーム送信時の回答のデータを取得します。

e.response.getItemResponse();

kintoneへ送信するJSON形式のデータを作成します。 回答者のメールアドレスは以下のAPI関数により取得できます.

e.reponse.getRespondentEmail();

kintoneへ送信するリクエストデータのJSON形式の詳細はこちらを参照してください。

 

[kintoneへデータを送信]

上記で作成したkintoneアプリの情報を設定します。

先ほど設定したkintone API連携用ライブラリを初期化し、上記関数で作成した、Google フォームの回答データを文字列からJSON形式に変換し、kintone へデータを送信します。

レスポンスのコードが200であれば送信成功です。

Step 12

トリガーの設定画面を表示し、[トリガーを追加]からトリガーを追加します。

017.png

 

イベント発生時に実行する関数、トリガーとなるイベントを設定し、保存します。

018.png

 

以上でGoogle Apps Scriptの設定は完了です。

6. 動作の確認

作成したGoogle フォームの右上の送信ボタンをクリックし、「フォームを送信」画面にて送信先のメールアドレス、件名、メッセージを入力し、送信ボタンでフォームを送信します。

019.png

 

メールに届いたGoogleフォームへのリンクより、回答を入力し送信します。

020.png

 

送信後、回答したデータがkintoneに記録されました。

021.png

7. まとめ

Googleフォームを使うとアンケートやイベントの出欠等のフォームを簡単に作成できる上、EmailやSNSで送信したり、自社のサイトにフォームを埋め込む事も可能です。その回答をkintoneアプリに自動的に記録することによって結果を効率的に管理できるのではないでしょうか。

8. 参照サイト

更新履歴

  • 2020/2/18
    • Google Formsの仕様変更により、
      OAuth scope の記載が必要となったため、manifest ファイルに OAuth scope の記載を追加
  • 2021/4/6
    • Google Apps Script の UI 変更に伴い、画像を差し替え

記事に関するフィードバック

記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。

Avatar
cybozu Development team

本田翔也 様

お世話になっております。cybozu developer network運営チームです。
返信遅くなり申し訳ございません。

こちら確認をしたところ、エラーメッセージは本連携と関係なく、
Google FormをChromeで実行するときに表示されるエラーのようです。

このエラーがある状態でも正常にコードが登録されますので、
無視していただいて問題ないかと存じます。

>こちら確認をしたところ、GoogleForms側に仕様変更があり、エラーが出ているようでした。
>現在調査中ですので、少々お待ちください。詳細分かり次第、再度ご連絡いたします。

こちらはエラーとは無関係で、GoogleForms側の仕様変更で、
OAuth の設定が必要だったので、記事に反映しました。

よろしくお願い致します。

Avatar
本田翔也

cybozu developer network運営チーム 様

お世話になります。

エラーの件、了解いたしました。

調査までしていただき、

ありがとうございます。

Avatar
市川

お世話になっております。

たくさんの記事をみて現在勉強中の身です。

今回こちらの記事を参考に設定をし、無事にアンケート内容をkintoneアプリの新規レコードとして反映させることができました。

こちらの記事では「新規レコード」を生成ということですが、例えばメールアドレスをキーとして、既存のレコードに対して更新、上書きといったことは可能でしょうか?

その場合は上記記事のどの部分を変更するといいのでしょうか?

ご教示いただけますと幸いです。

Avatar
cybozu Development team

市川裕輝様

お世話になっております。cybozu developer network 運営局です。

はい、既存レコードに対して更新をかけることは可能です。

まず、メールアドレスがキーであれば、メールアドレスを「値の重複を禁止する」設定を行います。(updateKey を使った更新を行うため

また、Step 11 に記載のコードで、38・39行目が登録するレコード情報の作成および登録処理になっているので、この箇所を更新処理に書き換えます。
この記事では、kintone に対する処理は、kintoe REST API を Google Apps Script で扱うためのライブラリ(有志の方が作成されています)を利用しています。
このライブラリについては、この記事でも記載している Qiita の記事 https://qiita.com/Arahabica/items/063877b0da439020d2c2#update をご参考ください。

なお、こちらのコメント欄はフィードバック欄となっております。
記事に記載されている以上の発展的な内容に関する質問は、コミュニティを利用していただきますよう、よろしくお願いいたします。

Avatar
市川

cybozu developer network 運営局様

お世話になっております。

ご回答いただきありがとうございます。

回答内容を基に実践してみます。

 

使い方がよくわかっておらず失礼いたしました。

以降はコミュニティを活用していきます。

Avatar
Taiki Goto

お世話になっております。

APIを使用しているという事はやはりルックアップフィールドの更新は出来ないのでしょうか?

Avatar
cybozu Development team

Taiki Goto 様

お世話になっております。cybozu developer network 運営局です。

検証はしておりませんが、レコードを登録するアプリのAPIトークンと、ルックアップ元となるアプリのAPIトークンを認証ヘッダに指定すれば、ルックアップフィールドの更新はできる認識です。

https://developer.cybozu.io/hc/ja/articles/201941754#step7 より
> APIトークン認証
> 複数のAPI トークンを指定できます。複数トークンはカンマ区切りまたは別ヘッダーで指定します。

具体的には、Step11 のコード 33行目以下のように書き換えます。

レコードを登録するアプリのAPIトークンが「TOKEN1」で、ルックアップ元となるアプリのAPIトークンが「TOKEN2」の場合

YOUR_APPLICATION1: { appid: アプリID, name: "kintone Meetup 参加者", token: "TOKEN1,TOKEN2" }
 

なお、こちらのコメント欄はフィードバック欄となっております。
記事に記載されている以上の発展的な内容に関する質問は、コミュニティを利用していただきますよう、よろしくお願いいたします。

Avatar
Taiki Goto

cybozu developer network 運営局様

お世話になっております。

アドバイス通り複数トークン使用し、無事に登録することが出来ました。

また、何かありましたらよろしくお願いします。

 

Avatar
しんご

お世話になります。

イマイチ理解できないので質問させていただきます。

STEP10において、マニフェストファイルへの記載でエラーが出ます。

下記のURLの登録部分が必須という認識でよろしいでしょうか。

https://developer.cybozu.io/hc/ja/articles/360015955171?_ga=2.218060946.563699840.1616578307-89490584.1616578307

Avatar
cybozu Development team

しんご 様
お世話になっております。cybozu developer network 運営局です。

こちらで検証したところ、OAthクライアントを登録せずとも正常に動作することを確認いたしました。
お手数ではありますが、表示されているエラーの内容をご共有いただくことは可能でしょうか。

ご確認よろしくお願いいたします。

Avatar
しんご

cybozu developer network 運営局様

お世話になっております。

手順通りに進めてjsonにコピーした記述を貼り付けて、保存をかけると下記のエラーが発生し、保存ができません。

Unexpected character ('"' (code 34)): was expecting comma to separate Object entries at [Source: (String)"{ "timeZone": "Asia/Tokyo", "dependencies": { "libraries": [{ "userSymbol": "KintoneManager", "libraryId": "1M8DHQSWWGOM2RSRjDZmylHMl03nZHnliaVMGMk84m6jQ05ditPBTCSM8", "version": "4" }] }, "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8" "oauthScopes": ["https://www.googleapis.com/auth/forms.currentonly", "https://www.googleapis.com/auth/forms", "https://www.googleapis.com/auth/script.external_request"] }"; line: 12, column: 4]

Avatar
しんご

cybozu developer network 運営局様

お世話になっております。

先程の件は解消されました。

 

先に進めて、最後の回答を送信したところ下記エラーが発生します。

 

SSL エラー https://サブドメイン.cybozu.<?>/k/v1/records.json at [unknown function](KintoneManager:37) at sendToKintone(コード:44)

 

サブドメイン部分に入力は間違いのないものとします。

<?>の部分も怪しいかなと思いますが、全部コピーして一通りやってみようとしているのでどこがおかしいのでしょうか

Avatar
cybozu Development team

しんご 様

エラー内容のご共有ありがとうございます。

確認したところ、こちらではエラーを再現することができませんでした。
サブドメイン部分のコードをコピーされた際に制御文字等が含まれている可能性もございますので、
手入力で打ち直してみるなどの対応をお試しいただけますでしょうか。

また、記事のコメント欄は当記事の内容に関するフィードバックのみ受け付けております。
個別の事象に関する技術的なご質問については、お手数ですが cybozu developer コミュニティ のご利用をお願いします。

Avatar
しんご

cybozu developer network 運営局様

お世話になっております。

ご確認ありがとうございます。

 

ご案内ありがとうございます。

お手数をおかけしました。

Avatar
小嶋

記事通り作成しましたが、Step10でappsscript.json に、掲載されているOAuth scopeを追加して保存ボタンを押すと、

「無効なマニフェスト ファイル「appsscript.json」」

 

というエラーが出て先に進めません。お知恵を貸していただけないでしょうか。よろしくお願いします。

Avatar
cybozu Development team

小嶋 様
お世話になっております。cybozu developer network 運営局です。

確認したところ、OAuth scopeの追加でエラーを再現することができませんでした。
記載していただいたエラーは、構文エラーが原因である可能性もございますので、
お手数ですが、「appsscript.json」に括弧やカンマの記述漏れなどがないかをご確認いただけないでしょうか。

また、記事のコメント欄は当記事の内容に関するフィードバックのみ受け付けております。
個別の事象に関する技術的なご質問については、お手数ですが cybozu developer コミュニティ のご利用をお願いします。

Avatar
小嶋

ありがとうございました。カンマを末尾に入れたところ次に進めました。

ただ、Kintoneに反映されず、、、

https://developer.cybozu.io/hc/ja/community/posts/4414511022105-Google%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%8B%E3%82%89Kintone%E3%81%AB%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84

にて投稿させていただきました。

Avatar
松井崇

お世話になります。

ドキュメントを参考にkintoneとgoogleフォームの連携を行い2021/10より運用を行なっておりました。

2022-01-29 17:49の動作を最後に、以後フォーム内容がKintoneに反映されなくなっております。
 
●状況
1、Googleフォームを実行すると、実行ログに以下のエラーが発生します。
 
・内容
「エラー ライブラリ(ID KintoneManager)がありません。ライブラリが削除されたか、読み取りアクセス権がない可能性があります。」
 
2、GASのスクリプト画面より、左メニューのライブラリ「KintoneManager」をクリックすると次のエラーが発生します
・内容
「ライブラリを検索できませんでした。ID とアクセス権限を確認して、もう一度お試しください。」
 
 
3、新エディタの「ライブラリの追加」にて、スクリプトIDを指定した検索が行えません
「1M8DHQSWWGOM2RSRjDZmylHMl03nZHnliaVMGMk84m6jQ05ditPBTCSM8」
・内容
「ライブラリを検索できませんでした。ID とアクセス権限を確認して、もう一度お試しください。」
 
●聞きたいこと1
他の方は同様の事象は発生しておりませんでしょうか。
問題切り分けのため、他の環境での発生状況をお伺いしたいです。
 
●聞きたいこと2
同様の事象が発生している場合で、解決方法をご存知の方がいらしましたらご教授いただけますと幸いです。
 
何卒よろしくお願いいたします。
 
Avatar
cybozu Development team

松井崇 様

お世話になっております。cybozu developer network 事務局です。

KintoneManager ライブラリのアップデートにより、
スクリプト ID が変更となりました。
新しいスクリプト ID は下記となっております。
1dtIBGa-2Ij4CSWl8cs4hnDPjVz43rnIrG_oT_nBTinwob2yBAW4anL_X

古いライブラリを削除し、新しいスクリプト ID によるライブラリの再追加をお願いいたします。
詳しくは、KintoneManager ライブラリ開発者による外部のブログ記事をご参照ください。
https://qiita.com/black777cat/items/31bd47b8b473f453f03d

また、新バージョンのライブラリと旧バージョンのライブラリは、完全な互換性は保証されておりません。
記事そのものの修正は、事務局で動作確認を行ってから対応いたします。

何卒よろしくお願いいたします。

Avatar
松井崇

cybozu developer network 事務局

ご担当者様

 

お世話になります。早々にご対応いただきありがとうございました。

変更後のスクリプトIDでも私の環境では動作致しませんでしたのでお知らせいたします。

記事の修正をお待ちしておりますので引き続きどうぞよろしくお願いいたします。

Avatar
cybozu Development team

松井崇 様

お世話になっております。cybozu developer network 運営事務局です。

大変申し訳ございません、案内いたしましたスクリプト ID が誤っておりました。
正しくは kintone とGoogle Apps Script連携 記事にございます通り、下記となっております。
1UMIqaatccEb68gRI0rDbupn8UdF5nxMcQghQXzyOLyEHnqunUoIcpU5y

お手数をおかけしてしまい申し訳ありませんが、ご確認をよろしくお願いいたします。

Avatar
松井崇

cybozu developer network 運営事務局

ご担当者様

 

お世話になります。

Kintoneライブラリを以下のもので更新し正常動作を確認いたしました。

更新:1UMIqaatccEb68gRI0rDbupn8UdF5nxMcQghQXzyOLyEHnqunUoIcpU5y

お忙しいところご確認いただきましてありがとうございました。

Avatar
mori

お世話になっております。

流れに沿って行ってみましたが、STEP10でつまずきました。

appsscript.json にキーとバリューを追加しましたが【無効なマニフェスト ファイル】と表示されます。

初歩的な質問で申し訳ないのですが キーとバリューは説明どおりのURLでよかったのでしょうか?

ご教授よろしくお願いいたします。

Avatar
cybozu Development team

森安昌吾 様
お世話になっております。cybozu developer network 運営局です。

本文にある OAuth scope で確認したところ、エラーを再現することができませんでした。
記載していただいたエラーは、構文エラーが原因である可能性がございますので、
お手数ですが、追加した OAuth scope に括弧や、末尾のカンマの記述漏れなどがないかをご確認いただけないでしょうか。

また、記事のコメント欄は当記事の内容に関するフィードバックのみ受け付けております。
個別の事象に関する技術的なご質問については、お手数ですが cybozu developer コミュニティ のご利用をお願いします。

Avatar
mori

cybozu developer network 運営局 様

お世話になっております。承知いたしました。

ご対応のほどありがとうございます。

 

Avatar
JIVE.t

cybozu developer network 運営局 様

お世話になります。
こちらのドキュメントを参考にしながら、
kintoneとgoogleフォームの連携を行い、
成功したのですが、
添付ファイルがあるアンケートには対応できますか?


他の項目と同じように添付ファイルを設定し、
アンケート送信してみたところ、kintoneには転送されませんでした。

また、その後、添付ファイルの項目を削除して設定しなおしたのですが、
kintoneに転送されなくなってしまいました。

解決方法をご教授いただければ幸いです。
よろしくお願いいたします。

JIVE.tにより編集されました
Avatar
cybozu Development team

JIVE.t 様

お世話になっております。cybozu developer network 事務局です。

こちらの記事のコメント欄は当記事の内容に関するフィードバックのみ受け付けております。
記事から発展した個別の事象に関する技術的なご質問については、
お手数ですが cybozu developer コミュニティ のご利用をお願いします。

Avatar
盛林 美砂

拝見させていただいており、助かっております。

kintone連携が出来なくて困っております。

アプリIDですが、.cybozu.com/k/guest/4/252/

ゲストなので、IDを入力する箇所には、どのように入力すれば良いでしょうか?

その他の原因がありましたら、教えてください。

ドメイン名をSSSとしています。

 

 

function sendToKintone() {
 
const getFormResponse = (e) => {
  'use strict';
  const itemResponses = e.response.getItemResponses();// アンケートの回答を取得
  let records = '[';
  records += Utilities.formatString('{"Email": { "value": "%s" }', e.response.getRespondentEmail());// 回答者のEmailアドレスの取得
  for (let i = 0; i < itemResponses.length; i++) {
    const itemResponse = itemResponses[i];
    switch (itemResponse.getItem().getTitle()) {
      case '参加しますか?':
        records += Utilities.formatString(',"attend" : { "value": "%s" }',
          itemResponse.getResponse());// 質問に対する回答を取得
        break;
      case '参加人数':
        records += Utilities.formatString(',"number_of_attendee" : { "value": "%s" }',
          itemResponse.getResponse());// 質問に対する回答を取得
        break;
      case '参加者の名前を記入してください':
        records += Utilities.formatString(',"name_of_attendee" : { "value": "%s" }',
          itemResponse.getResponse());// 質問に対する回答を取得
        break;
    }
  }
  records += '}]';
  Logger.log('Response JSON is "%s"', records);
  return records;
}

const sendToKintone = (e) => {
  'use strict';
  Logger.log('Form submitted');
  const subdomain = 'SSS.cybozu.com';// サブドメイン名
  const apps = {
    YOUR_APPLICATION1: {appid: 252, name: 'kintone Meetup 参加者', token: 'MUDaQ3ZZQ2pikUxOn'}
  };
  const manager = new KintoneManager.KintoneManager(subdomain, apps);// ライブラリーの初期化
  let str = getFormResponse(e);
  str = str.replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t');
  const records = JSON.parse(str);// JSON形式に変換
  const response = manager.create('YOUR_APPLICATION1', records);// kintone レコードの生成
  // ステータスコード
  // 成功すれば200になる
  const code = response.getResponseCode();
  Logger.log('Response code is "%s"', code);
}
 
}

 

Avatar
cybozu Development team

盛林 美砂 様

お世話になっております。cybozu developer network 運営局です。

こちらは記事に対するフィードバック欄になっております。
恐れ入りますが、記事から発展した内容に関するご質問についてはコミュニティをご活用ください。

https://developer.cybozu.io/hc/ja/community/topics

お手数をおかけいたしますが、どうぞよろしくお願いいたします。

Avatar
KenjiKiyofuji

Kintoneを導入し、GoogleFromとの連携をする必要が出来た為色々
やっておりましたが、プログラムの知識などもなく、試しに、こちらの記載通りに
入力してみましたが、上手くいかない為相談させていただきます。

Step10の内容を行いましたが、いつまでたっても、appsscript.jsonの横にオレンジ〇
(未保存状態?)が続き、保存ボタンを押しても、プロジェクトを保存しています。
のまま全く進みません。
sendToKintone.gs に関しては、保存できている状況です。
(転記が正しいか自信がない状態ですが)

このレベルで、相談するのは非常に申し訳ないですが、

何かアドバイスを戴ければ助かります。

ご面倒おかけしますが、何卒よろしくお願いします。

(こちらに張り付けた図では未記入になっておりますが、 step10の appsscript.json 4行目にある構文は初期段階から無く直接入力も試しましたが保存されませんでした。 )



サインインしてコメントを残してください。