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

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

ただいまの
回答率

87.37%

trelloAPIを用いたカード情報取得後の変数の整形について

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,012

前提・実現したいこと

trelloでタスク管理をしているのですが、毎日自分でチェックするのが面倒なのでGASを利用して
trelloのAPIとslackのwebhookを用いtrelloのリストごとに残タスクをslackに自動で
投げてくれるようなツールを作りたいです。

発生している問題・エラーメッセージ

trelloのAPIを使用してカードの名前とIDを取得することはできたのですが、
それを上手く整形できずに困っています。

エラーメッセージとは少し違うのですが、slack上で

ボット名
 Array
 Array


と表示されてしまいます。

該当のソースコード

function main(){
  getCardsFromList("hogehoge")//todoリスト
}

function getCardsFromList(listID){
  var DEV_API_KEY = "API_KEY";
  var API_TOKEN = "API_TOKEN";
  var url = 'https://api.trello.com/1/lists/' + listID + '/cards?key=' + DEV_API_KEY + '&token=' + API_TOKEN + '&fields=name';

  try {
         var response = UrlFetchApp.fetch(url, {'method':'get'}); // GETリクエスト 
         var message = "response";
         slack(message);
       } catch (er) { //エラー発生寺にログを記録
         var logText = "エラー : line - " + er.lineNumber + '\n Error: ' + er.message;
         addLog(logText);//スプレッドシートにエラーメッセージ記入
       }
}
function slack(message) {
  var postUrl = 'https://hooks.slack.com/services/hogehoge';
  var username = 'botbot';  // 通知時に表示されるユーザー名
  var icon = ':hatching_chick:';  // 通知時に表示されるアイコン
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}

試したこと

今回の問題はtrelloAPIから取得したresponseの型を整形できていないことから起きているのだと考え

var a = response.toString
slack(a)


を試しましたが、エラーが飛んでしまいました。以下がそのエラーメッセージです。

Error: https://hooks.slack.com のリクエストに失敗しました(エラー: 400)。
サーバー応答の一部: missing_text_or_fallback_or_attachments
(応答の全文を見るには muteHttpExceptions オプションを使用してください)

補足情報(FW/ツールのバージョンなど)

今年初めてPCを買い、プログラミング経験は3ヶ月で、メインはJavaを勉強してきました。
JSでの型の確認方法など調べたもののわからず、教えていただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    退会済みユーザー

    2019/09/01 00:35

    > trelloのAPIを使用してカードの名前とIDを取得することはできたのですが、
    > それを上手く整形できずに困っています。

    取得できた内容を記載し、どのように整形したいのかを書いて下さい。

    キャンセル

  • takuto-biginner

    2019/09/02 14:10 編集

    質問ありがとうございます。

    function addLog(text) {
    var spreadsheetId = "hogehoge";
    var sheetName = "シート1";
    var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
    var sheet = spreadsheet.getSheetByName(sheetName);
    sheet.appendRow([new Date()/*タイムスタンプ*/,text]);
    }

    を用いてスプレッドシートに記載すると

    [{"id":"hogehoge","name":"hogehgoe"}]

    のように出力されています。

    これをslackに飛ばせるように整形したいです。
    おそらくstringに直せば良いと思うのですが、、、

    キャンセル

回答 1

checkベストアンサー

+1

response に Array がはいっているようなので、👇のような感じでいかがでしょうか。
message には String を入れないといけないので、 card を一つずつ String にする必要がありそうです。

function getCardsFromList(listID){
  var DEV_API_KEY = "API_KEY";
  var API_TOKEN = "API_TOKEN";
  var url = 'https://api.trello.com/1/lists/' + listID + '/cards?key=' + DEV_API_KEY + '&token=' + API_TOKEN + '&fields=name';

  try {
         var response = UrlFetchApp.fetch(url, {'method':'get'}); // GETリクエスト 
         // var message = "response";
         // slack(message); // 誤 そもそもこれだと "response" が送信される?
         // 追記
         var jsonArray = JSON.parse(response.getContentText());
         jsonArray.forEach(function(card) { // CardのArrayなので一つずつ
           var message = "name:" + card.name + "\nclosed:" + card.closed;
           slack(message);
         });             
       } catch (er) { //エラー発生寺にログを記録
         var logText = "エラー : line - " + er.lineNumber + '\n Error: ' + er.message;
         addLog(logText);//スプレッドシートにエラーメッセージ記入
       }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/02 14:12

    ありがとうございます。
    いただいたコードで実行したところ
    "エラー : line - 80
    Error: オブジェクト [{""id"":""hogehoge"",""name"":""hogehoge""}] で関数 forEach が見つかりません。"
    とエラーが出てしまします。。

    trello APIで取得したデータは、ArrayListだと認識していたのですが、違うのでしょうか。。。?

    キャンセル

  • 2019/09/02 14:28

    調べたところ、 `UrlFetchApp.fetch` の返り値は `HTTPResponse` だったため、修正をしました。
    https://developers.google.com/apps-script/reference/url-fetch/http-response

    キャンセル

  • 2019/09/02 15:07

    ありがとうございます!
    jsonデータに変形することで上手くいきました!

    キャンセル

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

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

関連した質問

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