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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

解決済

1回答

408閲覧

slack での退勤管理「みやもとさん」のカスタマイズ

yumatakei

総合スコア20

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

2クリップ

投稿2018/01/16 10:26

編集2018/01/16 10:34

退勤管理をslackで管理しようと考えています。
そこで「みやもとさん」を導入することになりました。
ですが、このアプリでは、1日に1度の出勤にしか対応しておりません。
デフォルトでは
イメージ説明
このように出勤、退勤が管理されています。

イメージ
このように横に1日何度かの出勤退勤を全て保存できるようにしたいと思っていますが、javascript初心者の私には難しいです。
どなたかご教授をお願い致します。

変更点はこのコードだと考えています...

javascript

1loadGSTimesheets = function () { 2 var GSTimesheets = function(spreadsheet, settings) { 3 this.spreadsheet = spreadsheet; 4 this.settings = settings; 5 this._sheets = {}; 6 7 this.scheme = { 8 columns: [ 9 { name: '日付' }, 10 { name: '出勤' }, 11 { name: '退勤' }, 12 { name: 'ノート' }, 13 ], 14 properties: [ 15 { name: 'DayOff', value: '土,日', comment: '← 月,火,水みたいに入力してください。アカウント停止のためには「全部」と入れてください。'}, 16 ] 17 }; 18 }; 19 20 GSTimesheets.prototype._getSheet = function(username) { 21 if(this._sheets[username]) return this._sheets[username]; 22 23 var sheet = this.spreadsheet.getSheetByName(username); 24 if(!sheet) { 25 sheet = this.spreadsheet.insertSheet(username); 26 if(!sheet) { 27 throw "エラー: "+sheetName+"のシートが作れませんでした"; 28 } 29 else { 30 // 中身が無い場合は新規作成 31 if(sheet.getLastRow() == 0) { 32 // 設定部の書き出し 33 var properties = [["Properties count", this.scheme.properties.length, null]]; 34 this.scheme.properties.forEach(function(s) { 35 properties.push([s.name, s.value, s.comment]); 36 }); 37 sheet.getRange("A1:C"+(properties.length)).setValues(properties); 38 39 // ヘッダの書き出し 40 var rowNo = properties.length + 2; 41 var cols = this.scheme.columns.map(function(c) { return c.name; }); 42 sheet.getRange("A"+rowNo+":"+String.fromCharCode(65 + cols.length - 1)+rowNo).setValues([cols]); 43 } 44 //this.on("newUser", username); 45 } 46 } 47 48 this._sheets[username] = sheet; 49 50 return sheet; 51 }; 52 53 GSTimesheets.prototype._getRowNo = function(username, date) { 54 if(!date) date = DateUtils.now(); 55 var rowNo = this.scheme.properties.length + 4; 56 var startAt = DateUtils.parseDate(this.settings.get("開始日")); 57 var s = new Date(startAt[0], startAt[1]-1, startAt[2], 0, 0, 0); 58 rowNo += parseInt((date.getTime()-date.getTimezoneOffset()*60*1000)/(1000*24*60*60)) - parseInt((s.getTime()-s.getTimezoneOffset()*60*1000)/(1000*24*60*60)); 59 return rowNo; 60 }; 61 62 GSTimesheets.prototype.get = function(username, date) { 63 var sheet = this._getSheet(username); 64 var rowNo = this._getRowNo(username, date); 65 var row = sheet.getRange("A"+rowNo+":"+String.fromCharCode(65 + this.scheme.columns.length - 1)+rowNo).getValues()[0].map(function(v) { 66 return v === '' ? undefined : v; 67 }); 68 69 return({ user: username, date: row[0], signIn: row[1], signOut: row[2], note: row[3] }); 70 }; 71 72 GSTimesheets.prototype.set = function(username, date, params) { 73 var row = this.get(username, date); 74 _.extend(row, _.pick(params, 'signIn', 'signOut', 'note')); 75 76 var sheet = this._getSheet(username); 77 var rowNo = this._getRowNo(username, date); 78 79 var data = [DateUtils.toDate(date), row.signIn, row.signOut, row.note].map(function(v) { 80 return v == null ? '' : v; 81 }); 82 sheet.getRange("A"+rowNo+":"+String.fromCharCode(65 + this.scheme.columns.length - 1)+rowNo).setValues([data]); 83 84 return row; 85 }; 86 87 GSTimesheets.prototype.getUsers = function() { 88 return _.compact(_.map(this.spreadsheet.getSheets(), function(s) { 89 var name = s.getName(); 90 return String(name).substr(0, 1) == '_' ? undefined : name; 91 })); 92 }; 93 94 GSTimesheets.prototype.getByDate = function(date) { 95 var self = this; 96 return _.map(this.getUsers(), function(username) { 97 return self.get(username, date); 98 }); 99 }; 100 101 // 休みの曜日を数字で返す 102 GSTimesheets.prototype.getDayOff = function(username) { 103 var sheet = this._getSheet(username); 104 return DateUtils.parseWday(sheet.getRange("B2").getValue()); 105 }; 106 107 return GSTimesheets; 108}; 109

javascript

1// 出勤 2 Timesheets.prototype.actionSignIn = function(username, message) { 3 if(this.datetime) { 4 var data = this.storage.get(username, this.datetime); 5 if(!data.signIn || data.signIn === '-') { 6 this.storage.set(username, this.datetime, {signIn: this.datetime}); 7 this.responder.template("出勤", username, this.datetimeStr); 8 } 9 else { 10 // 更新の場合は時間を明示する必要がある 11 if(!!this.time) { 12 this.storage.set(username, this.datetime, {signIn: this.datetime}); 13 this.responder.template("出勤更新", username, this.datetimeStr); 14 } 15 } 16 } 17 }; 18 19 // 退勤 20 Timesheets.prototype.actionSignOut = function(username, message) { 21 if(this.datetime) { 22 var data = this.storage.get(username, this.datetime); 23 if(!data.signOut || data.signOut === '-') { 24 this.storage.set(username, this.datetime, {signOut: this.datetime}); 25 this.responder.template("退勤", username, this.datetimeStr); 26 } 27 else { 28 // 更新の場合は時間を明示する必要がある 29 if(!!this.time) { 30 this.storage.set(username, this.datetime, {signOut: this.datetime}); 31 this.responder.template("退勤更新", username, this.datetimeStr); 32 } 33 } 34 } 35 };

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

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

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

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

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

gouf

2018/01/16 14:45 編集

利用したことがないのですが、1日のうちに数度出退勤を記録するとどうなりますか? 上書きされてしまうのですか?(そうでない場合、シートの記録をもとにデータのフォーマットをあとで加工してあげるとよいような気もします)
yumatakei

2018/01/16 15:52

1日のうちに数度出退勤出来ないようになっています。もし、出勤をslackで行った場合でも反映されません、しかし、出勤時間や退勤時間の更新はできるようになっています。
guest

回答1

0

ベストアンサー

こういう、「こうしたいな」という発想はいいと思うのですが、仕様を考えるとき、その機能を実際に追加したときにどんな変化が起こるかを考えなくてはいけません。
例えば「おはようございます」と書いたら出勤扱いですが、二回目の「おはようございます」を検知したら二度目の出勤扱いとする、といった「明確な仕様」をまず記載すること、そして「二度目の出勤の時刻を修正したい」「三度目の出勤を指定時刻で入力する」「二度目の出勤データがないのに三度目の入力があったときどうするか」「おはようございますが二回連続で入力されたときどうするか」など、今まででは起こり得なかった無数の状況について「どう対処するか」の仕様が必要になります。
「おはようございます、お疲れ様でしたを何度でも検知してデータを増やす」ということを実装するのは比較的簡単ですが、こういった細かい例外を考慮しないかぎり、改造をやるべきではありません。もう少し細かいところまで机上で仕様を煮詰めてからにしましょう。我々としてもいまのふわっとした疑問にそのまま答えても、足りないところが発生するでしょうし、使い勝手も思ったものと違うものになることもあります。

投稿2018/01/17 00:33

masaya_ohashi

総合スコア9206

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

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

yumatakei

2018/01/17 05:30

ご回答ありがとうございます。 仕様を考える際に例外を考えることを怠っていました。 次回から質問させて頂く際には、例外などの仕様も考えてから質問しようと思います。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問