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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

Q&A

解決済

2回答

10619閲覧

チャットワークのメッセージを複数件一括削除したい

OBMURR

総合スコア12

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

0グッド

1クリップ

投稿2019/03/29 10:14

編集2019/04/01 07:18

やりたいこと

別の用件で、関係ないグループチャットにメッセージが300件ほど送信されてしまい、
さすがに見た目が悪いので一括削除したい

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

・検索かけても削除フルコードが転がっておらず自分でできない

該当のソースコード

メッセ削除API
http://developer.chatwork.com/ja/endpoint_rooms.html#DELETE-rooms-room_id-messages-message_id

DELETE/rooms/{room_id}/messages/{message_id} curl -X DELETE -H "X-ChatWorkToken: 自分のAPIトークン" "https://api.chatwork.com/v2/rooms/{room_id}/messages/{message_id}"

試したこと

削除したいmessage_idは下記コードで取得済みです
取得API http://developer.chatwork.com/ja/endpoint_rooms.html#GET-rooms-room_id-messages
・100個のmessage_idをシートに記載している
・その範囲を{message_id}に入れたい
・削除して再度取得→削除を繰り返して300件ほど削除したい(最大100件まで取得の仕様なため)

function getmessage(){ var params = { headers : {"X-ChatWorkToken" : 'トークン'}, method : "get" }; var roomID = ルームID; var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages?force=0"; //指定のグループチャットからメッセージを取得 var strRespons = UrlFetchApp.fetch(url, params); //チャットワークAPIエンドポイントからレスポンスを取得 var mySS = SpreadsheetApp.openById("スプシーxxxxx"); var sheet = mySS.getSheetByName('シート24').getRange(1, 1); var json = JSON.parse(strRespons.getContentText()); //文字列をJSON形式として解析しJSONオブジェクトとして返す for each(var obj in json){ Logger.log(obj.body); } for(var i=1; i<json.length; i++) { // スプレッドシートに書き込む sheet.offset(i, 0).setValue(json[i]["message_id"]); sheet.offset(i, 1).setValue(json[i]["body"]);  } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

余談
メッセージ取得自体が最新100件しかできないため、消したいメッセージの後にメッセージが100以上追加されると、消したいメッセージ自体が取得できなくなり、idがわからず削除できなくなります。

また、メッセージ取得後に再度取得しようとしても、APIの末尾が"~messages?force=0"だと、100件の中に未取得メッセージがないためエラーになります。
force=1であれば何度でも再取得できますが、force=0で未取得100件を取得できるわけでなく、常に”最新”100件のため、さらに前のメッセージは取得自体できません。

投稿2019/04/08 05:40

OBMURR

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

削除したいメッセIDは下記で取得済みです

・100個のメッセIDをシートに記載している
・その範囲を{message_id}に入れたい
・削除して再度取得→削除を繰り返して300件ほどのメッセをなくしたい

早く回答してほしいという状況は質問者様ご自身には、どういう戦術で早く回答させるかというゲームなんです。
「メッセ」とか「スプシー」とか自分が便利なだけの略語(分かるやろというスタンス)とか、公式APIへのリンクを貼っていないこととか、chatworkの制約で一回に100個しか取れない仕様を秘匿していることとかは、このゲームにおいて不利なスタンスです。
(最後の点は致命的で、なぜ100個しかとってないの?なぜ一々削除して取得を繰り返さなければならないの?なぜわざわざ複雑なコードにしなきゃいけないの?というのが、質問者様が100個で面倒臭くなっただけと思われたら回答する人はいなくなるでしょう)

検証していないですがAPIに準拠すればこれで消えるはず。うまく行けば、bulkDelete()のあとgetMessages()を再度実行して、bulkDelete();getMessages();bulkDelete();で消えると思われる。

ただし、リクエスト間隔とか考えてないので過剰なアクセスで蹴られるかもしれない。
かといって、コメントアウトしているような愚直なsleepをしてしまうと、長時間実行になり、gas側で止められる(1スクリプトの継続が何分かになると長すぎって怒られて強制停止される)

javascript

1function delMessage(id) { 2 var params = { 3 headers : {"X-ChatWorkToken" : 'トークン'}, 4 method : "delete" 5 }; 6 var roomID = "ルームID"; 7 var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/messages/" + id; 8 UrlFetchApp.fetch(url, params); 9 // Utilities.sleep(1000); 10} 11function bulkDelete() { 12 var mySS = SpreadsheetApp.openById("スプシーxxxxx"); 13 mySS.getSheetByName('シート24').getRange(2, 1,100,1).getValues().forEach(function(e){ delMessage(e[0]);}); 14}

投稿2019/03/30 18:06

編集2019/04/01 12:44
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OBMURR

2019/04/01 07:02

コードのご提示ありがとう御座います。 実行するのはfunction bulkDelete()のみで合ってますでしょうか? 下記エラーが出てしまいました。 →TypeError: オブジェクト Range で関数 forEach が見つかりません。 諸々のご指摘ありがとう御座います。 >早く回答させるか そのような高慢なつもりではないですが、知恵袋などで緊急状態自体を示すステータスがあったりするので、それを真似てのことでした。 >公式APIへのリンクを貼っていないこととか、 最初、リンクをコピペしていましたが、記載箇所がコード仕様なのと、リンク先にいちいち飛ばせるのも不便なことかと思い、実際とんでも記載した内容しか書かれてないため、リンク先の必要なコードのみを記載した次第です。 >chatworkの制約で一回に100個しか取れない仕様を秘匿していることとか chatworkAPIに精通している人しか対応方法もわからないだろうと思っていました… (面倒臭くなっただけと思われたら回答する人はいなくなるでしょう) なるほど、そういう風にも取られるのですね 総じて不親切な投稿にご回答頂きありがとう御座います。
papinianus

2019/04/01 12:45

getValuesを入れました。
OBMURR

2019/04/02 06:16

再度試して、実行するのはfunction bulkDelete()なのですが、下記エラーが出ました。 >https://api.chatwork.com/v2/rooms/ + roomID +/messages/ のリクエストに失敗しました(エラー: 400)。サーバー応答の一部: {"errors":["Invalid Endpoint or HTTP method"]}(応答の全文を見るには muteHttpExceptions オプションを使用してください) エラーに関して下記は関係あるでしょうか??(エラー文で検索しても、適切な結果がどれか分からず抽象的な返しで申し訳ないです) http://developer.chatwork.com/ja/endpoints.html
papinianus

2019/04/03 05:52

エラーとしてこのメッセージがそのままでるのですか?roomIDなどと?
OBMURR

2019/04/05 01:51

+ roomID +の部分はそのまま出すわけにいかないため、コードの記載に合わせて書き換えたものです。
papinianus

2019/04/05 03:18

messages/のあとにidがないのですが、これも削った結果ですか?
OBMURR

2019/04/05 05:17

いいえ、「 + roomID +」以外は編集せず原文のままになります。
papinianus

2019/04/05 15:29 編集

ということはidがないので、apiに正しくアクセスできてないのではないかと思います。100個のデータの中に空白はありませんか? あるいはdelMessageの最初でidが空だったらreturnするように加筆すればよいかと思います
OBMURR

2019/04/08 05:33

消さなくていいidを削除してidが100個ない状態でしたので100行の指定を以下のように最下行に変えました。 var lastRow = mySS.getRange("a:a").getLastRow(); var id = mySS.getRange(2, 1,lastRow ,1).getValues(); id.forEach(function(e){ delMessage(e[0]);}); これも同じエラーになりましたが、なんとChatWork見るとメッセージ消えてました、、!謎ですが実行されてました。 なので、頂いた構文について実行出来ましたのでベストアンサーとさせて頂きますmm
papinianus

2019/04/09 15:41

同じエラーになるってことは、getLastRowで想定したより下まで取得されたんじゃないかと思います。あるいは、前回実行時に既に消えてるものがあったとか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問