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

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

ただいまの
回答率

90.50%

  • API

    1821questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Google Apps Script

    1259questions

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

  • ChatWork

    32questions

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

チャットワークのタスク取得結果が不安定・タスク投稿日を取得したい

受付中

回答 3

投稿 編集

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

OBMURR

score 2

回答募集中:追加で実現したいこと

・タスク投稿日を取得したい(メッセージ取得には"send_time"があるが、タスク取得にはない?)

→別スクリプトでアクティブセルを基準に日付入力はしたことあるのですが、編集だと作動しても、「タスクシート」に数式で情報が入るだけではアクティブセルにならず作動しませんでした(トリガー:編集時)
トリガー:編集が増えると重くなるので、タスク取得と同じスクリプトで出来ないのであれば諦めます。

・(現在自分でも検索中ですが)同じタスクに登録された担当者全員を取得したい
→タスク担当者=取得するアカウントだと、逆引きになるのでそもそもできない、、、?
一緒に登録される可能性のあるアカウント全員取得しても、同じタスクでもタスクIDが違うため何で一致させるかが問題

前提・実現したいこと

複数人と共有で使っているチャットワークのアカウントのタスクをGASで取得し「タスク集約シート」に集約、内容を整えたものを数式で「タスクシート」に一覧にしています。
トリガーは「変更時」です。(編集だとなぜか動かないときがある?)
自分のチャットワークはビジネスアカウント、取得したいアカウントは私が作ったためフリープランです。

スクリプト作成当初、組織外メンバーである私が作ったアカウントのタスクは取得出来なかったのですが、私のアカウントと一緒に登録されたタスクは取得できることがわかりました。
ですが、たまに丸々取得出来ていないときがあって不安定で困っています。
(1つ足りないときもあります)

また、「タスクシート」編集で作動したりしなかったり、不安定です。
スクリプトでは「タスク集約シート」を指定してますが、トリガーは「タスクシート」編集にしたいです。

もう一点、「タスクシート」編集で作動した際、一番最新のタスクのみ2つになるのでこちらも改善したいです。

発生している問題

こちらに改めてまとめます
・取得タスク結果が空になるときがある
・1つ取得できてないタスクがあるときがある(実際の例だと1つ目のタスクが取得できていない)
・「タスクシート」編集で作動したりしなかったりする
・「タスクシート」編集で作動した際、一番最新のタスクのみ2つになる

該当のソースコード

function getTasks(){
  var params = {
    headers : {"X-ChatWorkToken" : '誰のトークンでも動く'},
    method : "get"
  };
  var roomID = 部屋ID; //タスクを拾うチャット
  var account_id = タスクを取得したい他人のアカウント;
  var url = "https://api.chatwork.com/v2/rooms/" + roomID + "/tasks?force=0&account_id=" +account_id+ "&status=open"; //(?force=0で未取得のみ)指定のグループチャットからタスクを取得
  var strRespons = UrlFetchApp.fetch(url, params); //チャットワークAPIエンドポイントからレスポンスを取得

  var json = JSON.parse(strRespons.getContentText()); //文字列をJSON形式として解析しJSONオブジェクトとして返す

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('タスク集約').getRange(1, 1);


  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]["task_id"]);
      sheet.offset(i, 1).setValue(json[i]["body"]); //本文
      sheet.offset(i, 2).setValue(json[i]["assigned_by_account"]["name"]); //依頼者
      sheet.offset(i, 3).setValue(json[i]["limit_time"]); //期限
}
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

0

  • 取得タスク結果が空になるときがある
    →chatworkに聞いてください。空にならないときがあるということは、スクリプトは正しい。つまりデータによる、ということです。
  • 「タスクシート」編集で作動したりしなかったりする
    →作動しないと考える根拠は何でしょうか?
  • トリガーは「変更時」です。(編集だとなぜか動かないときがある?)
    →例えば、「コメント」を付ける行為は「編集」トリガを発動しなかった記憶があります。「なぜか」ではなくなぜ動かないかを調査するのがデバッグです。繰り返しになりますが、トリガが発動することが(稀でなくそれなりに)あり、発動したときに正しい結果が得られることが(それなりに)あるなら、やっている操作が原因です。スクリプトからは何も調べようがないです。
  • 「タスクシート」編集で作動した際、一番最新のタスクのみ2つになる
    →forceパラメータは、仕様にはありませんが、もしコメントで書いていることが真実なら未取得が2件なのでは?また、他のどこで発動したら3件以上取得できるのでしょうか。

ざっくりコードも見ましたが、force=0以外はAPI仕様に適合しているので、権限とかデータとかの問題なんで、調べようがない気がします。

いちおう編集トリガでシート単位での動作にするには

function getTasks(){
const sheetName = SpreadsheetApp.getActiveSheet().getName();
if(sheetName !== "タスク") { return; }


などとすれば↑で書いたシート以外での編集時の処理を抑制できます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/04 14:26

    〉→chatworkに聞いてください。空にならないときがあるということは、スクリプトは正しい
    なるほど、了解です。

    〉→作動しないと考える根拠は何でしょうか?
    タスクが追加されたあとに、「タスクシート」を編集してもタスクが取得できなかったためです
    やはりこれもコードで出力シートに指定している「タスク集約シート」の編集ではないからでしょうか

    〉→forceパラメータは、仕様にはありませんが、もしコメントで書いていることが真実なら未取得が2件なのでは?また、他のどこで発動したら3件以上取得できるのでしょうか。
    いえ、3件以上にはならないですね。
    「タスク集約シート」の編集なら正しく更新されますが、「タスクシート」の編集でコードが実行された際は最新タスクが2件になります。

    forceの指定の記載があったのはメッセージ取得の欄だったかな…
    また、タスク取得のコード例を載せてる人のサイトでも使われてました。

    〉書いたシート以外での編集時の処理を抑制できます。
    逆にコードとは無関係のシートでの編集で作動してほしい時は
    if(sheetName === "タスク")
    とすれば明らかな指定ができるということでしょうか
    タスク集約シート→コードでタスク出力に指定してるシート
    タスクシート→編集でコードを実行したいシート

    キャンセル

  • 2019/03/04 14:40

    2つ目と4つ目の「>」について、
    →編集時トリガはどのシートでも発動します。そして、質問のコードはアクティブスプレッドシートは参照していても、現在選択中のシートやセルには依存しないコードになっています。
    つまり、どこのシートで編集しても、同じふるまいをすると想定しています(もちろん無駄に動かないように制御する必要はあるとは思いますが)
    なので、集約シートでは正常、タスクシートでは2件、というのは考えにくいです。
    →if(sheetName === "タスク") とすれば明らかな指定ができるということでしょうか
    「シートがタスクのときにifブロック内の動作させる」「シートがタスクでないときに以降の処理を中断する」は意味的には同じです。私としては「ガード句」というプログラミングで一般的な手法で、違ったらやめると書いています。
    それ以降の処理を全てifのあとの{}に含めれば、「明らかな指定」はできると思います。

    3つ目は動作検証しないと答えられないので、手がつけられるかどうか。

    キャンセル

  • 2019/03/04 16:00

    デバックをきちんと行うために、forceなしなら最新タスクが2つにならないのか検証してみます。
    ただ、どのシートで編集しようと差はないのですね、、、

    (ちなみに「タスク集約シート」は他人は触らないのでアクティブシートは「タスクシート」になってるはずです。
    なのに、アクティブシート=”getSheetByName('タスク集約')”としているので何かコードの中で齟齬が起きているとか、、、は関係ないですか?

    キャンセル

  • 2019/03/04 16:26

    もとのコードの「getActiveSpreadsheet()」はアクティブスプレッドシート。なので、タスクにいようとタスク集約にいようと、共有しているこのスプレッドシート(エクセルで言うブック)を指します。で、触るところで、そのスプレッドシートのうち、集約シートだとgetSheetByNameしているので、齟齬は起こりません。

    今の話をうかがって思ったんですが、他の人が触っているときにトリガが発動してないんじゃないでしょうか?質問者様ご本人がやっても、動いたり動かなかったりますか?

    キャンセル

  • 2019/03/04 17:41 編集

    あら、、スプレッドシートって特定のシートのみを指すのではなくブック自体のことなのですね。

    >他の人が触っているときにトリガが発動してないんじゃないでしょうか?質問者様ご本人がやっても、動いたり動かなかったりますか?
    →まさか!?と思いましたが、
    17:31に追加されたタスクについて、他の人が「タスクシート」で行削除を行ったらそのタスクも追加されました。(その間、私は触らず)
    ただ先程、タスクシートもタスク集約シートも、私が編集(文字入力・それをクリア)しても実行しないときもありました。
    なにかスクリプトが立て込んでるのでしょうか、、(変更時トリガー3つ使用中)
    シート操作のトリガーでなく、スクリプト実行をボタンにした方が確実かな、とも今考えています。
    (スプレッド変更履歴を見ると誰も触らない土日や夜間に私だけの変更履歴がありますがコード実行のことでしょうか…誰かがシート編集して私作成のコードが実行されたならその人の変更履歴もあるはずなのにない)

    (forceの関係でタスクを重複取得している疑いについて自己解決欄にて追記致しました。初歩的な勘違いでした、、

    キャンセル

0

・1つ取得できてないタスクがある(実際の例だと1つ目の〜、、、

これについては、やはり一番古いタスクのみが常に取得できないようなので、
取り急ぎの解決法としてダミータスクを作成し、
それ以降に作成されたタスクは取得できるようにしています

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

・「タスクシート」編集で作動した際、一番最新のタスクのみ2つになる
について

回答済みの下記について一つ訂正です。
>また、他のどこで発動したら3件以上取得できるのでしょうか。
>>いえ、3件以上にはならないですね。

他の実験シートでも同じコードを記述しタスク取得していたのですが、
そちらのシートはずっと放置してる間、同じタスクが6つになっていました。
取得したタスクを先頭行から上書きしている状態なので、前回取得時よりタスクが少ない場合、最下行のタスクが残り重複取得しているように見えていただけでした、、、

取り急ぎシートクリアを追加しました

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • API

    1821questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Google Apps Script

    1259questions

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

  • ChatWork

    32questions

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