質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

フォームに回答がされたらチャットワークに通知する機能をつけたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 248

yuki0137

score 3

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 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 の戻り値(レスポンス)の確認とはどのような操作を行えばよいのでしょうか。

    キャンセル

回答 1

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());
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/25 14:30 編集

    ご回答いただきありがとうございます。レスが遅くなり申し訳ございません。
    「このトリガー実行時にはまだスプレッドシートには書き込まれていない」と記載いただいた通り、トリガー実行時には書き込まれていないため一つ上の行にある回答内容を通知するようになっていました。

    そのため10分おきにトリガーが実行されるよう時間ベースでの設定を追加しましたが、シートによって通知がされたりされなかったりという現象が起きています。10分おきに実行されているはずですがnoticedの最新行にTRUEが入りません。

    トリガー実行時に、最新行にTRUEが入っていなければ通知をするというコードを組んでいるつもりですがよりよい構文の書き方がありますでしょうか。

    キャンセル

  • 2020/07/25 15:13

    なぜわざわざ面倒な方法を採用するのでしょうか?回答に書いたように引数から値取った方が簡単では無いですか?

    キャンセル

  • 2020/07/25 15:36

    すみません、回答に書いていただいたスクリプトをどう活かせばよいのか分からず…。
    メールではなくチャットワークへ送るようGmailApp.sendEmail以降を書き換えればよろしいのでしょうか。
    今組んでいるスクリプトと組み合わせるのか、あるいはいただいたスクリプトを元に1から組み直すのか見当がつかず、教えていただけますでしょうか。

    キャンセル

  • 2020/07/28 11:54

    時間ベースのトリガーを設定したことで通知されるようになりましたので一旦解決とさせていただきます。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る