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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

API

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

ChatWork

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

Q&A

解決済

1回答

1761閲覧

スプレッドシート上の指定列が入力された際、入力列の情報をチャットワークへ送信するスクリプト

hbc

総合スコア16

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

API

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

ChatWork

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

0グッド

2クリップ

投稿2019/03/31 14:06

前提

GAS(GoogleAppsScript)について質問です。
社内で共有している受付シートです。
項目を入力していき、受付まで埋まりきったところでチャットワークへ送信される
スクリプトを作りたいと考えてます。
イメージ説明
表がすべて埋まったら次のシートへ移って行き、5まで行ったら
シート1へ戻り、中身を削除してまた利用するというサイクルで運用しています。
単純にチャットワークへ送信できるところまでは確認できました。
細かい条件式などでご教示いただければ幸いです。
イメージ説明

実現したいこと

1.指定の列(受付)が入力されたら、入力列の情報をチャットワークへ送信したい。
2.日付から内容(B~F)まで入力されている状態で受付(G)が入力されたら送信したい。

発生している問題

1.どのセルを編集しても情報が送信されてしまう。
2.セルを削除すると編集扱いになり空データが送信される。
3.日付表記がごちゃごちゃしてしまい分かりづらい。

該当のソースコード

function myFunction() { var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet.getLastRow(); var token = PropertiesService.getScriptProperties().getProperty('CW_TOKEN'); for(var i = 2; i <= lastRow; i++) { if(!sheet.getRange(i, 8).getValue()){ var values = sheet.getRange(i, 1, 1, 7).getValues(); var body = '[info]' body += '日付:' + values[0][1] + '[hr]'; //day body += '時間:' + values[0][2] + '\n'; //time body += '氏名:' + values[0][3] + '\n'; //person body += '番号:' + values[0][4] + '\n'; //number body += '内容:' + values[0][5] + '\n'; //naiyou body += '受付:' + values[0][6] + '[/info]'; //tantou sendMessage(token, body); sheet.getRange(i, 8).setValue(true); break; } } if(i >= lastRow) { sheet.getRange(2, 4, lastRow - 1).clearContent(); } } function sendMessage(token, body){ var cw = ChatWorkClient.factory({token: token}); cw.sendMessageToMyChat(body); }

スクリプトについてはネットからの見様見真似です。
運用上、もっと別の式を構築すべきなのでしょうか。
どなたかご教示いただけると幸いです。
どうぞ宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • 前提

myFunctionに編集時トリガーでかけられている(他の人が編集したときどうすんの?)
運用ルールは守られている(具体的には、B列には日付が入っている。少なくとも受付は最後に記入される。送信済みのものは必ずTrueになっている)

javascript

1function myFunction(e) { 2 if(e["value"] === undefined) { return; } //削除時は何もしない 3 const c = e.range.getColumn(); 4 if(c !== 7) { return; } //G列でなければ何もしない 5 const r = e.range.getRow(); 6 const sheet = e.range.getSheet(); 7 const data = sheet.getRange(r,1,1,8).getValues()[0]; 8 if(data[7]) { return; } //H列がTRUEだったら何もしない。true以外のtruelyな文字列が入っていると誤動作する 9 var message = '[info]'; 10// message += '日付:' + prettyPrintDate(data[1]) + '[hr]'; //day 11 message += '日付:' + data[1] + '[hr]'; //day 12 message += '時間:' + data[2] + '\n'; //time 13 message += '氏名:' + data[3] + '\n'; //person 14 message += '番号:' + data[4] + '\n'; //number 15 message += '内容:' + data[5] + '\n'; //naiyou 16 message += '受付:' + data[6] + '[/info]'; //tantou 17 18 const token = PropertiesService.getScriptProperties().getProperty('CW_TOKEN'); 19 sendMessage(token, message); 20 sheet.getRange(r,8).setValue(true); 21} 22function prettyPrintDate(d) { //B列が空白とか日付っぽく見えるただの文字列だったらエラーになる 23 return (d.getMonth() + 1) + "/" + d.getDay(); 24} 25 26//質問からコピー 27function sendMessage(token, body){ 28 var cw = ChatWorkClient.factory({token: token}); 29 cw.sendMessageToMyChat(body); 30}

ここでclearContentをプログラム的にやるのは筋違いだと思うので、外しました。
(5行目を書くやいなや、送信して消すことは可能ですが、それだったらわざわざシートを5個も用意してヒストリ残している運用がただのアホなムダ手間ってことになっちゃうんで)

ここまで大幅な書き換えをするのは面倒なんですが、今のコードを直すほうが面倒なんで。あと、分かっていると思いますが、スクリプトエディタから「関数の実行」しても動かないので、シートで編集してくださいね。
最初にも書きましたが、他の人が書いたときにはトリガ発動しないから送信されない気がするよ。

投稿2019/04/01 14:43

編集2019/04/05 15:25
papinianus

総合スコア12705

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

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

hbc

2019/04/02 11:41

papinianus様、早速のご回答、誠にありがとうございます。 複数人で共有し記入していく受付スプレッドシートですので、私だけでなく共有ユーザーの編集によるトリガー発動が目的です。どのように宣言すれば宜しいのでしょうか。。 プログラムの書き換え、ありがとうございました。 こちらをコピペしてテスト編集してみたのですが、TRUEが出ずエラーが起きてしまいました。 何か私の方で見落としている箇所がございますでしょうか。 更なるご回答を頂けると幸いです。
papinianus

2019/04/03 05:18

どういうエラーか伺えますか? 他人にトリガーかける方法は私が知りたいくらいです。確実なのは全員が同じ関数をトリガー登録することです。
hbc

2019/04/03 10:54

トリガーの件、承知致しました。では共有したスプレッドシートにそれぞれコードを貼り付けてトリガー登録させて試してみようと思います。 下記、エラーについてです。 Stackdriver のログ エラー ReferenceError: 「sendMessage」が定義されていません。 at myFunction(コード:18) エラー TypeError: undefined のメソッド「getMonth」を呼び出せません。 at prettyPrintDate(コード:22)
papinianus

2019/04/03 13:39

sendMessageは質問にあるコードをそのまま再利用してください。 分かりにくいので回答にも足します。 prettyPrintDateでそういうエラーにはならないと思うのですが、B列は日付が入っていますよね? ちょっとここキリがなくなるので、日付が望ましい表示にはならないかもしれませんが、回答をかえます。
hbc

2019/04/04 10:54

書き換えありがとうございます。 申し訳ないですがA~Fまで入力された状態でGに入力してもTRUE確認できず、実行エラーとなってしまいました...。どこか私のほうで根本的な何かを間違えているのでしょうか。 エラー ReferenceError: 「body」が定義されていません。 at myFunction(コード:19) エラー TypeError: undefined からプロパティ「value」を読み取れません。 at myFunction(コード:2) エラー TypeError: undefined のメソッド「getMonth」を呼び出せません。 at prettyPrintDate(コード:23) エラー 指定された属性の値が無効です: Header:null at [unknown function](client:78) at [unknown function](client:120) at [unknown function](client:33) at sendMessage(コード:29)
papinianus

2019/04/04 11:32 編集

分かってるはずだと思ってたのですがもしかして関数の実行やデバッグをしていませんか? 編集時トリガーで動くものもprettyPrintもsendMessageもデバッグや関数の実行では必ずエラーになります。 最初のエラー文のみ対応しました。今のところ動かない原因としてbodyしか考えにくいので。
hbc

2019/04/05 04:02

ありがとうございます。 チャットワークに送られてきたのですが "[info]" のみで他の情報が送信されませんでした。 あともう少しの所で申し訳ございません。
papinianus

2019/04/05 15:25

constにしてました。varに変えました
hbc

2019/04/06 21:29

ありがとうございます。 お陰様で求めていたものができました。 日付、時間表記については試行錯誤してみます!
hbc

2019/04/13 07:09

日付、時間表記については、スプレッドシート側で表示形式を”書式なしテキスト”を選択することで運用することにしました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問