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

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

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

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

API

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

ChatWork

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

Q&A

3回答

677閲覧

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

OBMURR

総合スコア12

Google Apps Script

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

API

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

ChatWork

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

0グッド

0クリップ

投稿2019/03/01 05:42

編集2019/03/06 06:00

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

・タスク投稿日を取得したい(メッセージ取得には"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"]); //期限 } }

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

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

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

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

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

guest

回答3

0

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

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

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

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

投稿2019/03/04 08:21

OBMURR

総合スコア12

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

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

0

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

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

投稿2019/03/04 05:31

OBMURR

総合スコア12

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

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

0

  • 取得タスク結果が空になるときがある

→chatworkに聞いてください。空にならないときがあるということは、スクリプトは正しい。つまりデータによる、ということです。

  • 「タスクシート」編集で作動したりしなかったりする

→作動しないと考える根拠は何でしょうか?

  • トリガーは「変更時」です。(編集だとなぜか動かないときがある?)

→例えば、「コメント」を付ける行為は「編集」トリガを発動しなかった記憶があります。「なぜか」ではなくなぜ動かないかを調査するのがデバッグです。繰り返しになりますが、トリガが発動することが(稀でなくそれなりに)あり、発動したときに正しい結果が得られることが(それなりに)あるなら、やっている操作が原因です。スクリプトからは何も調べようがないです。

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

→forceパラメータは、仕様にはありませんが、もしコメントで書いていることが真実なら未取得が2件なのでは?また、他のどこで発動したら3件以上取得できるのでしょうか。

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

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

javascript

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

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

投稿2019/03/01 06:43

papinianus

総合スコア12705

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

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

OBMURR

2019/03/04 05:26

〉→chatworkに聞いてください。空にならないときがあるということは、スクリプトは正しい なるほど、了解です。 〉→作動しないと考える根拠は何でしょうか? タスクが追加されたあとに、「タスクシート」を編集してもタスクが取得できなかったためです やはりこれもコードで出力シートに指定している「タスク集約シート」の編集ではないからでしょうか 〉→forceパラメータは、仕様にはありませんが、もしコメントで書いていることが真実なら未取得が2件なのでは?また、他のどこで発動したら3件以上取得できるのでしょうか。 いえ、3件以上にはならないですね。 「タスク集約シート」の編集なら正しく更新されますが、「タスクシート」の編集でコードが実行された際は最新タスクが2件になります。 forceの指定の記載があったのはメッセージ取得の欄だったかな… また、タスク取得のコード例を載せてる人のサイトでも使われてました。 〉書いたシート以外での編集時の処理を抑制できます。 逆にコードとは無関係のシートでの編集で作動してほしい時は if(sheetName === "タスク") とすれば明らかな指定ができるということでしょうか タスク集約シート→コードでタスク出力に指定してるシート タスクシート→編集でコードを実行したいシート
papinianus

2019/03/04 05:40

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

2019/03/04 07:00

デバックをきちんと行うために、forceなしなら最新タスクが2つにならないのか検証してみます。 ただ、どのシートで編集しようと差はないのですね、、、 (ちなみに「タスク集約シート」は他人は触らないのでアクティブシートは「タスクシート」になってるはずです。 なのに、アクティブシート=”getSheetByName('タスク集約')”としているので何かコードの中で齟齬が起きているとか、、、は関係ないですか?
papinianus

2019/03/04 07:26

もとのコードの「getActiveSpreadsheet()」はアクティブスプレッドシート。なので、タスクにいようとタスク集約にいようと、共有しているこのスプレッドシート(エクセルで言うブック)を指します。で、触るところで、そのスプレッドシートのうち、集約シートだとgetSheetByNameしているので、齟齬は起こりません。 今の話をうかがって思ったんですが、他の人が触っているときにトリガが発動してないんじゃないでしょうか?質問者様ご本人がやっても、動いたり動かなかったりますか?
OBMURR

2019/03/04 09:20 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問