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

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

ただいまの
回答率

90.50%

  • Google Apps Script

    1259questions

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

  • ChatWork

    32questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 290

OBMURR

score 2

やりたいこと

別の用件で、関係ないグループチャットにメッセージが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"]); 

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • キャンセル

  • 退会済みユーザー

    2019/03/31 02:53

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

0

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/01 16:02

    コードのご提示ありがとう御座います。

    実行するのはfunction bulkDelete()のみで合ってますでしょうか?
    下記エラーが出てしまいました。
    →TypeError: オブジェクト Range で関数 forEach が見つかりません。

    諸々のご指摘ありがとう御座います。
    >早く回答させるか
    そのような高慢なつもりではないですが、知恵袋などで緊急状態自体を示すステータスがあったりするので、それを真似てのことでした。

    >公式APIへのリンクを貼っていないこととか、
    最初、リンクをコピペしていましたが、記載箇所がコード仕様なのと、リンク先にいちいち飛ばせるのも不便なことかと思い、実際とんでも記載した内容しか書かれてないため、リンク先の必要なコードのみを記載した次第です。

    >chatworkの制約で一回に100個しか取れない仕様を秘匿していることとか
    chatworkAPIに精通している人しか対応方法もわからないだろうと思っていました…
    (面倒臭くなっただけと思われたら回答する人はいなくなるでしょう)
    なるほど、そういう風にも取られるのですね
    総じて不親切な投稿にご回答頂きありがとう御座います。

    キャンセル

  • 2019/04/01 21:45

    getValuesを入れました。

    キャンセル

  • 2019/04/02 15: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

    キャンセル

  • 2019/04/03 14:52

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

    キャンセル

  • 2019/04/05 10:51

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

    キャンセル

  • 2019/04/05 12:18

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

    キャンセル

  • 2019/04/05 14:17

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

    キャンセル

  • 2019/04/06 00:27 編集

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

    キャンセル

  • 2019/04/08 14: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

    キャンセル

  • 2019/04/10 00:41

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Google Apps Script

    1259questions

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

  • ChatWork

    32questions

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