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

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

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

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

Q&A

2回答

1175閲覧

GASでのチャットワーク通知

yukiiii

総合スコア8

Google Apps Script

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

0グッド

0クリップ

投稿2019/06/06 05:51

編集2019/06/06 05:51

GASをつかって、スプレッドシートに記載のある内容をチャットワークへ送信したいと考えております。
※ボタンを設置し、トリガーとする

以下の内容だと、送信判断の列が空白である最終行しか送信されないため、
何行か追加した後にこのスクリプトを実行すると、送信漏れが発生してしまいます。

function newInquireNotice() { // シート情報を取得 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = SpreadsheetApp.getActiveSheet(); // 複数シートがある場合、お目当てのシートの話じゃないならやめる var sheetName = sheet.getSheetName(); if (sheetName !== "シート名") { // ←ここは使ってるシート名を入れてあげてください return; } // ラベル列を検索して返す関数 function colSearch(label) { for (i = 1; i <= sheet.getLastColumn(); i++) { if (sheet.getRange(4, i).getValue() == label) { return i; } } } // 列数 var dateCol = colSearch("依頼日"); var taskCol = colSearch("対応内容"); var noticedCol = colSearch("送信判断"); // 最新行のnoticedがtrue入ってなければ通知出してtrueにする関数 function newNotice() { lastRow = sheet.getLastRow(); var thisNoticed = sheet.getRange(lastRow, noticedCol); if (thisNoticed.getValue() !== true) { var newtask = sheet.getRange(lastRow, taskCol).getValue();    var message ="メッセージ内容newtask"; var client = ChatWorkClient.factory({token: 'トークン'}); client.sendMessage({room_id: ID, body: message}); // 通知済のところをtrueにする sheet.getRange(lastRow, noticedCol).setValue(true); // 依頼日に日付を追加する sheet.getRange(lastRow, date1Col).setValue(new Date()); } } newNotice(); }

【現在の動き】

依頼日内容送信判断
6/6AAAtrue
6/6BBB
6/6CCC

↓スクリプト実行

依頼日内容送信判断
6/6AAAtrue
6/6BBB
6/6CCCtrue

CCCの内容だけがチャットワークに通知


【希望の動き】

依頼日内容送信判断
6/6AAAtrue
6/6BBB
6/6CCC

↓スクリプト実行

依頼日内容送信判断
6/6AAAtrue
6/6BBBtrue
6/6CCCtrue

BBBとCCCの内容が、続けてチャットワークに通知


お力を貸していただけますと幸いでございます。

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

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

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

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

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

papinianus

2019/06/06 10:23

コードの引用元を記載してください
guest

回答2

0

まずまず微妙なコードなのは間違いないですけど、使いかたが間違ってます。
そもそも最後の1行しか動かないようにしたサンプルなんです。
なのでこれをパクリたければ最終行に記入するたび毎回ボタンを押せばいいだけ。

javascript

1function newInquireNotice() { 2 // シート情報を取得 3 const sheet = SpreadsheetApp.getActiveSheet(); 4 const all = sheet.getDataRange().getValues(); 5 const header = all.slice(0,1)[0].reduce(function(a,c,i){a[c] = i; return a;},{}); 6 7 // 列数 8 const dateCol = header["依頼日"]; 9 const taskCol = header["対応内容"]; 10 11 postChatWork(all.slice(1).filter(function(e){ return !e[dateCol]; }).map(function(e){ return e[taskCol];})); 12 13 sheet.getDataRange.setValues(all.map(function(e) { if(!e[dateCol]){ e[dateCol] = new Date();} return e; })); 14} 15function postChatWork(messages) { 16 const roomId = ""; 17 const appToken = ""; 18 const client = ChatWorkClient.factory({token: appToken}); 19 messages.forEach(function(e) { client.sendMessage({room_id: roomId, body: e}); }); 20}

投稿2019/06/18 15:06

papinianus

総合スコア12705

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

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

0

最適化しようと思うとコードがっつり書き換えなければいけないのですが、
本当にシンプルに繰り返しするという意図で行けば

GAS

1/* 省略 */ 2 function newNotice(targetRow) { // 対象行は引数で受け取る 3 if (targetRow < 1) { 4 return false; // 対象は0行目以下は処理できない 5 } 6 7 var thisNoticed = sheet.getRange(targetRow, noticedCol); 8 9 if (thisNoticed.getValue() !== true) { 10 var newtask = sheet.getRange(targetRow, taskCol).getValue(); 11 var message ="メッセージ内容newtask"; 12 var client = ChatWorkClient.factory({token: 'トークン'}); 13 14 client.sendMessage({room_id: ID, body: message}); 15 16 // 通知済のところをtrueにする 17 thisNoticed.setValue(true); // ここだけ修正してみた 18 19 // 依頼日に日付を追加する 20 sheet.getRange(targetRow, date1Col).setValue(new Date()); 21 22 return true; // 送信した場合は続行のためtrueを返す 23 } 24 25 return false; // 送信していない場合は終了のためfalseを返す 26 } 27 28 var row = sheet.getLastRow(); 29 while(newNotice(row--)){} 30 31/* 省略 */

※テストしてないので、動かなかったらごめんなさい。

投稿2019/06/07 01:21

macaron_xxx

総合スコア3191

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問