フォームに回答がされたらチャットワークに通知する機能をつけたい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 651
前提・実現したいこと
Googleフォームに回答がされると、チャットワークに通知を行う機能を実装したいと
考えています。
複数のフォームの回答シートが1つのスプレッドシートにまとめられており、
回答があったら(行が追加されたら)一部の情報を拾って通知用のルームに投下したいです。
発生している問題・エラーメッセージ
別の作業者が、全く同じシートの構成で同じルームに通知している別スプレットシートに組んだ
コードをコピペして作成しましたがうまく通知されず、何が原因かが分かりません。
該当のソースコード
/*
専用フォームからの申込み通知
*/
function autoreply() {
/*
newInquireNotice13();
newInquireNotice14();
*/
}
/*
専用フォームからの申込み通知
*/
function newInquireNotice13() {
// シート情報を取得
//作業するスプレッドシートを指定
var ss = SpreadsheetApp.openById("********");
var sheet = ss.getSheetByName('シート1');
// ラベル列を検索して返す関数
function colSearch(label) {
for (i = 1; i <= sheet.getLastColumn(); i++) {
if (sheet.getRange(1, i).getValue() == label) {
return i;
}
}
}
// company, name, noticedの列数
var companyCol = colSearch("company");
var nameCol = colSearch("name");
var noticedCol = colSearch("noticed");
var supplypointCol = colSearch("supplypoint");
var urlCol= colSearch("url");
var dayCol= colSearch("day");
// 最新行のnoticedがtrue入ってなければ通知出してtrueにする関数
function newNotice() {
lastRow = sheet.getRange("B:B").getValues().filter(String).length; //B列の最終行
var thisNoticed = sheet.getRange(lastRow, noticedCol);
if (thisNoticed.getValue() !== true) {
var name = sheet.getRange(lastRow, nameCol).getValue();
var company = sheet.getRange(lastRow, companyCol).getValue();
var supplypoint = sheet.getRange(lastRow, supplypointCol).getValue();
var pcpurl = sheet.getRange(lastRow, pcpurlCol).getValue();
var saitenday = sheet.getRange(lastRow, saitendayCol).getValue();
var message ="[info][title]フォームからの申込み[/title]"
+ " " + company +" "+ name +"さまからの依頼を承りました。\n" + "・場所 :"+" "+supplypoint +"\n"
+ "・URL :"+" "+url +"\n"
+ "・予定日 :"+" "+ Utilities.formatDate(day, 'JST', 'yyyy/MM/dd') +"[/info]"
// 通知済のところをtrueにする
sheet.getRange(lastRow, noticedCol).setValue(true);
//投稿するルームを指定して投稿
var room_ID =ルームID;// https://www.chatwork.com/#!rid*****
var token ='APIトークン代入';//自分のトークン
var params = {
headers : {"X-ChatWorkToken" : token}, //APIトークン
method : "post",
payload : {
body : message, //タスクの内容
to_ids : 自分のアカウントID
}
};
var url = "https://api.chatwork.com/v2/rooms/" + room_ID + "/messages";
UrlFetchApp.fetch(url, params); //チャットワークAPIにリクエスト
}
}
newNotice();
}
試したこと
チャットワークへのAPI連携は自分のアカウントで出来るように設定し
コードに組み込みましたがチャットへの投下が行われませんでした。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
プロジェクトトリガーに「フォームから - フォーム送信時」を指定しているなら指定した関数の引数から送信された値を取得できます。
未確認できすが、このトリガー実行時にはまだスプレッドシートには書き込まれていない(または非同期に書き込まれている)のかもしれません。
↓↓ 自分のメールアドレス宛に回答の内容を送るサンプル
/**
* 「フォームから - フォーム送信時」トリガーから起動される処理
* @param {GoogleAppsScript.Events.FormsOnFormSubmit} e イベント情報
*/
function onSend(e) {
const responses = {};
e.response.getItemResponses().forEach(item => {
const title = item.getItem().getTitle();
const res = item.getResponse();
responses[title] = res;
});
const body = JSON.stringify(responses, null, 4);
GmailApp.sendEmail("(自分のメールアドレス)", "テストフォーム", body);
}
↓↓送られてくるメールのサンプル
{
"記述式": "aaaaaaa",
"ラジオボタン": "選択肢 3",
"チェックボックス": [
"選択肢 1",
"選択肢 2"
],
"プルダウン": "選択肢 1"
}
参考:
Google Forms events
https://developers.google.com/apps-script/guides/triggers/events?hl=en#google_forms_events
Class FormResponse
https://developers.google.com/apps-script/reference/forms/form-response
(レスポンスの確認について追記)
UrlFetchApp.fetch の戻り値(レスポンス)の確認とはどのような操作を行えばよいのでしょうか。
const response = UrlFetchApp.fetch( .... );
if(response.getResponseCode() !== 200) {
throw new Error(response.getContentText());
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
draq
2020/07/21 12:24
うまく通知されず、とはどういう状態でしょうか。エラーがでないのに Chatwork に通知が来ない?エラーが出る?そもそも処理が呼ばれない?具体的な状態を記載してください。
また、newInquireNotice13 はどこから(何をトリガーに)呼ばれているんでしょうか。
draq
2020/07/21 12:27
というか、コピー元を作成した作業者に聞いた方が早いのでは。
yuki0137
2020/07/21 12:41
エラーがでないのに Chatwork に通知が来ない状態です。
シートに回答が追記されたらnewInquireNotice13が動くように設定しているつもりですが
何か不自然なところがありますでしょうか。
コピー元の制作者もGASに詳しくなく、APIトークンの取得くらいしか原因が分からないそうなので
ここにあげさせていただきました。
draq
2020/07/21 12:49
処理が呼ばれていることは確認しているということですか?
コード書くだけで何も設定しなくても呼ばれるのは、Simple Triggers と呼ばれるものだけです。
参考:https://developers.google.com/apps-script/guides/triggers
あと、UrlFetchApp.fetch の戻り値(レスポンス)の確認も必要です。ステータスコードに200が返ってきていない可能性もあります。
yuki0137
2020/07/21 17:00
プロジェクトのトリガーを設定してみました。フォーム送信時にnewInquireNotice13が実行されるように設定しましたがやはりルームに通知は来ていませんでした…。
すみません…UrlFetchApp.fetch の戻り値(レスポンス)の確認とはどのような操作を行えばよいのでしょうか。