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

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

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

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

API

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

ChatWork

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

Q&A

解決済

1回答

3136閲覧

チャットワークの複数タスクをGASで完了させたい

OBMURR

総合スコア12

Google Apps Script

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

API

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

ChatWork

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

0グッド

0クリップ

投稿2019/02/26 08:39

編集2019/03/04 07:08

前提・実現したいこと

自分のタスク一覧をスプレッドに取得しています。
タスクを複数人で使用してるため、スプレッド上で完了に複数タスクのステータスを変更したいです。
※タスクに人数分を登録されると各々の完了作業が大変なため代表の私だけをタスク担当に登録

・シート1にステータスopenのタスクを取得
・シート3に成形後のタスク一覧を反映、タスク内容を終えたらステータス列のH列に「done」を記載してタスクを完了したい ※doneが複数ある状態
・実行タイミングはH列に「done」が記載されたら、をトリガーにしたいが重くなるのが心配

参考API

PUT/rooms/{room_id}/tasks/{task_id}/status curl -X PUT -H "X-ChatWorkToken: 自分のAPIトークン" -d "body=done" "https://api.chatwork.com/v2/rooms/{room_id}/tasks/{task_id}/status"

該当のソースコード

function myFunction() { var params = { headers : {"X-ChatWorkToken" : 'トークン'-d "body=done" }, method : "PUT" }; var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート3'); var maxRow=mySheet.getDataRange().getLastRow(); var myVars=mySheet.getDataRange().getValues(); for(var i=2;i<=maxRow;i++){ if(myVars[i-1][8-1]="done"){ var task_id = myVars[i-1][1-1]; //task_idの列 "https://api.chatwork.com/v2/rooms/{room_id}/tasks/" + task_id + "/status";    //完了指示 } } //var strRespons = UrlFetchApp.fetch(url, params); //チャットワークAPIエンドポイントからレスポンスを取得 //var json = JSON.parse(strRespons.getContentText()); //文字列をJSON形式として解析しJSONオブジェクトとして返す }

試したこと

タスク追加のPOSTメソッドの例文などを編集してなんとかならないかと試行錯誤しましたがお手上げです。。。

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

チャットワークはビジネスアカウントです

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

動作検証してないですし、無保証ですが、過去の質問対応の経験からするとこういう雰囲気かと思います。

javascript

1function q176577(e) { 2 if(e === undefined) { e = buildEventObjByActiveCell(); } 3 const sheet = e.range.getSheet(); 4 const sheet3 = "シート3"; 5 Logger.log("this sheet is "+ sheet.getName()); 6 if(sheet.getName() !== sheet3) { return; } 7 const done = "done"; 8 Logger.log("value is " + e.value); 9 if(e.value !== done) { return; } 10 const colH = 8; 11 Logger.log("editing colum at "+e.range.getColumn()); 12 if(e.range.getColumn() !== colH) { return; } 13 const taskid = e.range.offset(0, -7).getValue(); //offsetの指定は自信ない 14 const token = "とーくん"; 15 const rid = "るーむid"; 16 const apiUrlRoom = "https://api.chatwork.com/v2/rooms/" + rid + "/tasks/" + taskid + "/status"; 17 18 const res = UrlFetchApp.fetch(apiUrlRoom, 19 { 20 headers: {'X-ChatWorkToken': token}, 21 method: 'put', 22 payload: {'body': "done" }, 23 muteHttpExceptions : true, 24 }); 25 Logger.log(res); 26} 27function buildEventObjByActiveCell() { 28 const sheet = SpreadsheetApp.getActiveSheet(); 29 const cell = sheet.getActiveCell(); 30 var e = {}; 31 e.value = cell.getValue(); 32 e.range = cell; 33 return e; 34}

投稿2019/02/26 08:57

編集2019/03/05 03:00
papinianus

総合スコア12705

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

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

OBMURR

2019/02/26 10:24

回答有難う御座いますmm taskidがA列であることを記載漏れておりました、、、 が、offsetで-7していただいてますねmm 2行目の「range」だけ、下記エラーが出てしまいました。 >TypeError: undefined からプロパティ「range」を読み取れません。(行 2 SpreadsheetApp.getActiveSpreadsheet();に変えてエラーになりませんが その後の指示に影響ないでしょうか。。 実行後は「ログが見つかりません。」になるのでoffsetの指定だけ見直してみます
papinianus

2019/02/26 11:37

関数の実行ではうごきません。編集時トリガーをかけてください
papinianus

2019/02/26 11:43

これを改変するとしたらe.rangeをgetActiveRangeかなにかカーソルがあるセルにするようにすればいいと思います。 ご提示のようにアクティブシートで動くとなると、すでにdoneのものも何度となくステータス更新することになり、apiの叩き方としてあまりお作法が良くないですね。 それであればdoneと書くのではなく日付を入れるようにし、23時にトリガーをかけて、今日の日付を持つもののをまとめて完了にするといった運用の転換を考えたほうがいいと思います。
OBMURR

2019/02/27 04:05 編集

>編集時トリガーをかけてください 承知しました >すでにdoneのものも何度となくステータス更新する なるほど、、それは重くもなるし良くないですね、、 >日付を入れるようにし、23時にトリガーをかけて、今日の日付を持つもののをまとめて完了にする ”タスク完了”をもって依頼者に「完了報告」としていて、完了しないかわりにタスク追加時点に飛び、何を完了したのか引用することもできますが、ワンクリック増えるのでやはり都度”タスク完了”したいのですよね、、 登録を代表者のみにするのを諦めて、今のやり方である「複数人をタスクに登録・担当した人が完了」は継続し、面倒なタスク削除だけ一日最後にまとめてトリガーする、など方法の転換も考慮してみます。 ”GASでタスク完了”はググっても実例が出てこなかったので、同じ目的の方はこのままでも利用できると思いますし、ご回答頂き有難う御座います。
papinianus

2019/02/27 05:08

3つ目のパラグラフで仰っていることが理解できませんでした。 私の意図としては、「編集時トリガーでその瞬間動く」or「定時実行する」の2択があり得ると思っています。 質問者さまがやった"関数の実行"は「定時」を想定した操作です(人間が押そうが、時刻トリガで押そうが、結局は編集した瞬間でないので)。それは、今の構造にはマッチしていない。データ形式をあらためるほかないということです。 私としては、都度完了の回答を書いているので、それができないもしくは難しいという立場?で仰っていることは理解の範疇を越えます。 誰がどう登録しようが、タスクの編集権がある人のトークンで、編集時に実行すれば、都度完了できます。 ※ 関数の実行で動くような補助を入れました。
OBMURR

2019/03/01 03:54

あら、、昨日結構長文を返信したのですが反映されてないようなので要点のみ再投稿致します。 ・元頂いていたスクリプトでも今度は「 e.range.getSheet();」でもエラーにならず関数の実行ができました(この手の出来たり出来なかったりよくあるのがGASの謎です ・新たに頂いたスクリプトでは、「done」があると下記エラーが出るので、やはりoffSetを見直せば解決するかもです >TypeError: オブジェクト Range で関数 offSet が見つかりません。(行 10、
papinianus

2019/03/01 04:38

offset(Sが小文字)が正しいみたいです
OBMURR

2019/03/01 07:04

なるほど、、、 再度試しました! エラーにならず実行したようですが、ログだと下記エラーが出ておりました。 >ログが見つかりません。Logger API を使用してプロジェクトにログを追加してください。 ※編集権限がある自分のタスクを取得 ちなみに他人のタスクを取得して編集権限がないタスクだと当然ながら下記エラーが出ましたのでoffsetの指示には問題ないということでしょうか、、 [19-03-01 15:09:43:587 JST] {"errors":["You don't have permission to edit the task"]}
papinianus

2019/03/01 07:26

おかしいですね。taskの更新に成功したら、{"task_id":1234}とかが返ってくるはず。完了にはなってますか?
OBMURR

2019/03/04 05:10

いえ、関数の実行をして、ログが見つからない。となるので、タスクの更新自体は出来ていません。 (編集トリガーも設定した後なので、何度もトリガーでも作動したとは思いますが…) 編集権限のないタスクだと「変更できない」結果が変えるなら、問題点はoffsetではないのかな、と…
papinianus

2019/03/04 05:28

エラーもログもないその状況だと、シート名が「シート3」ではない(シート名がマッチしてない)、入力値が「done」ではない、8列目ではない、などが考えられます。 回答に追記をして、どこで処理が中断されたか分かるように改めます。
OBMURR

2019/03/04 07:23

シート追加時に、シート3と自動で命名されましたが、実際は”sheet3”ではないのですかね、、Excelなら一致しますけど、、 前提情報に間違いがないか、実際のスプシーをキャプチャして追加致しました。 改めてこの状態で関数の実行をしてみましたが、エラーがない&ログがない&タスクステータスに変更なし、でした
papinianus

2019/03/04 07:29

ほぼ強制的にログが出るくらい、Loggerを追加した回答に改めましたが、ログはありませんか? たとえば「3」と「3」はプログラム的には違うので、動作しなくなる可能性があります。
OBMURR

2019/03/05 02:52

コードの修正有難う御座います。 保存時に下記エラーが出まして、()の数自体は一致してるのでどこを修正していいかわからず、、、、 >引数リストの後に ) がありません。(行 12、
papinianus

2019/03/05 03:01

Logger.log("editing colum at "+e.range.getColumn()); のところが、画面では`+e.range.C`のように途切れていました。編集画面に入ると正常だったので、どういう事情か分かりませんが、更新しました。
OBMURR

2019/03/06 06:05

修正有難う御座います! ログが出たので確認頂けないでしょうか? >[19-03-06 15:03:36:933 JST] this sheet is シート1
papinianus

2019/03/07 00:30

それだと、シート1を触っているので更新できなくて良いはずです。 シート1を触って動かしたいなら、コードの上から4行目のシート3をシート1にしてください
OBMURR

2019/03/07 03:12

いえ、シート1は取得だけのシートで、作業はシート3(doneがある)のでシート3で作動してくれていいのですが、、、このときは関数の実行で行いました。 今、シート3を編集してトリガー発動させましたが、タスク取得が発動しただけでしたので、再度関数の実行を行ったらログが前回と変わりました >[19-03-06 19:04:00:510 PST] this sheet is シート3 [19-03-06 19:04:00:511 PST] value is ですが、タスク完了は出来てませんでした
papinianus

2019/03/07 07:41

今度はdoneになってないですね。編集後、すぐにログを、見てください。関数の実行をすると再発動しますし、ログが消えます
OBMURR

2019/03/11 01:56

他のトリガーを削除して、タスク完了トリガーだけをシート編集で発動させましたが、ログは同じでした >[19-03-10 18:53:37:501 PDT] this sheet is シート3 >[19-03-10 18:53:37:502 PDT] value is undefined
papinianus

2019/03/11 02:16

valueがundefinedなんですが、値を削除してませんか? この詰まりかただと、状況を見てリターンしているところを全て取り除いて、いつでも動くようにするのが良いように思います。 動作検証としては「シート3」の「H列」の「done」にしたセルを、マウスで選択状態にして、「関数を実行」で実行してみるのがとりあえずの方法かと思います。
OBMURR

2019/03/11 03:55

>値を削除してませんか? とは、シート3に「done」がないのでは?ということでしょうか? むしろ編集で発動させるためdoneを増やしています >マウスで選択状態にして、「関数を実行」で実行 そんな事今までにもたまたまあったのでは、、と思いながら実行してみたらセル選択していたタスクだけ完了していてログも出ていました!(感動 >[19-03-10 20:16:35:141 PDT] this sheet is シート3 >[[19-03-10 20:16:35:142 PDT] value is done >[[19-03-10 20:16:35:142 PDT] editing colum at 8 >[[19-03-10 20:16:35:748 PDT] {"task_id":"127267212"} H列の2行目から8行目までdoneがある状態で行いました。 複数セル選択した状態で実行しても先頭のタスクしか完了できないようですね。 話の流れで目的が変わったため、putをDELETEにしてタスク削除にしたいのですがエラーになってしまいました、、 >[19-03-11 12:44:51:415 JST] {"errors":["Invalid Endpoint or HTTP method"]} また削除の場合複数タスクで行いたいので別途検索してみます。 タスク完了も、本番環境で取得してる第三者のタスクでは使えないかと思いますが、試してみます。
OBMURR

2019/03/11 04:02

第三者のタスクでも完了できました!(焦 こちらではタスクを「一つずつ」「完了」しかしないのでまんま使わせて頂きますmm 長いことお付き合い頂き有難う御座います!
papinianus

2019/03/11 04:03

> >値を削除してませんか? > とは、シート3に「done」がないのでは?ということでしょうか なぜそうなるか不明ですが、1つ前のコメントでvalueがundefinedになっていました。トリガでこうなるためには、スプレッドシート上で、H列の値を「done」にする以外の操作、特にどこかのセルで「デリートキーを押す」**削除**操作をしたと思いました。 例えば、ログは最後に動いたときの操作しか残りませんので、シートでdoneにしたあと、全く別の場所で入力を消したのではないかなーと。 動くときは正常なようなので、編集トリガの動作が怪しいのですね。他の話もそうですが、なんか不安定ですよね?? なお、1つ目しか動かないのは、もともと文字を入力し終えた瞬間での動作を想定していたからで、このときに複数をdoneにする、はあまり想定していなかったからです。こう書いて思い付きました。もしかしてまとめてdoneにしてますか?
OBMURR

2019/03/11 06:04

>こちらではタスクを「一つずつ」「完了」しかしないのでまんま使わせて頂きますmm ボタンにスクリプトを割り当て、タスク完了した際、ついでにタスク取得も発動してほしいので タスク完了する行の削除も入れたいのですが、どこに追加するのが適切でしょうか? const res = UrlFetchApp.fetch(apiUrlRoom, の次で大丈夫ですか? >他の話もそうですが、なんか不安定ですよね?? タスク取得に関してはシート編集だけでも、安定して発動するようになっています(解決策はわかりませんが、、 念の為ボタンも追加したので安定稼働にはできました。 >複数をdoneにする、はあまり想定していなかったからです。 投稿の時点で、タイトル&本文内に、複数タスクを完了したい&※doneが複数ある状態と記載しておりました。 複数人で複数タスクを着手しているためです。 でも一人が完了するタスクは1つなので、発動→アクティブセルのタスク1つを完了で構いません。 >もしかしてまとめてdoneにしてますか? 下記のようなことでしょうか? >H列の2行目から8行目までdoneがある状態で行いました。
papinianus

2019/03/11 06:13

ちょっと誤解がある部分だけ取り急ぎ、複数のdoneの話です。 「H列の2行目から8行目までdoneがある状態」というのが、doneという文字をどこかでコピーしておいて、H2:H8を範囲選択して、まとめて貼り付けする操作をするのでしょうか、ということが伺いたかったのです。 複数タスクを完了にする&doneが複数あるといっても、手で(プルダウンなどでもいいですが)1セルずつdoneにする限りは、影響ないようなコードを書いているはずです(例えば、1セルずつの縛りを守るかぎり、たてつづけに7回、H2から下方向に連続的に貼り付けを繰り返しても(多少遅延しますが)、全部のタスクが完了になるデータ送信はできると考えます)
OBMURR

2019/03/11 08:04

>まとめて貼り付けする操作をするのでしょうか、ということが伺いたかったのです。 違いますね(貼り付けをまとめて行う事自体、重要なことではないですが、、 >1セルずつdoneにする限りは、影響ないようなコードを書いているはずです そうですね、それが「タスク1つずつ完了」の現状ですね doneが複数あるので、1回の発動で複数タスクを完了したかったのです が、先に書いたように「完了」に関しては1回1つずつでよくなりました >タスク完了する行の削除も入れたいのですが、どこに追加するのが適切でしょうか? 追加したところ、行削除&タスク完了したのですが、 関数内で行削除してもシート変更に値しないのでタスク取得の方は発動せず(これ不便 行削除の意味なく、完了したタスクがまたシートに表示されてしまったので タスク取得関数も呼び出し、「タスク完了+行削除+タスク取得」しました。 行削除した際に完了するタスクが消えるのに、タスク取得されるまでの間に 再度表示されるのがカッコ悪いですが仕方ないですよね、、、
papinianus

2019/03/11 08:47

削除と再表示の関係が分からないのですが、別質問のほうで、clearするみたいなことを書いておられたかと思います。取得でリセットされるなら、タスク完了→タスク取得すれば、(clearによって)削除された結果が得られそうなので、再表示現象は抑制できるかなと。 また、集約シートに限っては(作りにもよりますが)フィルタなどの条件でdoneになるものは集約して表示されないようにしておけば、処理シートで一時的にどのような状態になっていようと、利用上不整合は起きないのかなと。 このあたりで対応できないなら、スクリプトによる動作は、イベントを発動しないのと、gasは処理がさほど早くない(トリガが多いとかじゃなくて、外部に取得に行く処理が全般に早くないです)のでおっしゃる挙動は仕方ないように思います。
OBMURR

2019/03/11 09:28

>取得でリセットされるなら、タスク完了→タスク取得すれば、(clearによって)削除された結果が得られそうなので、再表示現象は抑制できるかなと。 確かにタスク更新だけなら行削除不要なのですが、 done記載の取得と連動してない備考列を、行削除でタスクと一緒に消さないと ずれることになる(左のタスクと一致しない情報が残る)ので 行削除をアナログにしているのです、、 (例:2行目にいる№2のタスクを完了する際、№2の備考も一緒に行orセル削除しないと、№3の備考セルが2行目に移動せず3行目のままになる) ご提案頂いたフィルタ利用はGASでしょうか?(前述踏まえても利用できるか想像ができていない、、
OBMURR

2019/03/12 04:09

>追加したところ、行削除&タスク完了したのですが、 こちら勘違いで、やはり他人が登録したサブ垢タスクは権限がなく完了できませんでした スクリプトのオーナーの問題かと思うのですが、サブ垢のトークンあるのにサブ垢チャットを編集する方法はないのでしょうか、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問