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

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

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

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

1回答

12218閲覧

グーグルスプレッドシートで簡単に時間入力出来るようにしたい

Phukuoka

総合スコア8

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2016/04/20 00:27

###前提・実現したいこと

グーグルスプレッドシートでの時間入力・管理で

・ 数字を直接入力出来るようにしたい

・ 分、秒、コンマ秒(小数点第二位まで)の表示としたい

これらの設定のしかたをご教示頂きたく存じます。

**###発生している問題・エラーメッセージ
**
今は、「時間:分:秒:コンマ以下」(文字の部分は、実際は数値を入力します)と打ち込むと、時間を省略したタイム表記がされる仕様にしています。

このとき、数字を直接入力すると、「時間」でなく「数字」と認識され、時間表記に変換されないようです。

例)「3分4秒56」を「0030456」と入力すると、「0030456」と表示される。
同上 「0:03:04.56」と入力すると「3:04.56」と表示される。
(1桁目の0は、「0時間」を意味します)

希望 → 「030456」と入力して、「3:04.56」と表示させたい
※「0時間」との入力も省きたい(1時間かかることはないので)

###試したこと

表示形式 の 数字 の 表示形式の詳細設定 の カスタム数値形式 を 「m:s.00」と設定

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

なお、作成したい表は
・ 複数人が対象(5〜10人程度)
・ ラップ(周回)タイムを個人ごとに入力(1回20ラップ程度)
・ 上記を基に対比グラフを作成

目的は、各人のタイムと自分の位置を「見える化」することで、モチベーション維持&アップを図ることです。

いろいろな検索語でググッてみたのですが、
私が求める答えに出会えず、更に彷徨ってたところ、
本サイトに辿り着いた次第です。

皆様のお知恵を拝借いたしたく、
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ちょっと似たような感じのものを昔作ったことがあります。それの操作中の画面を動画に撮ったものが残っていたので、YouTube にアップしてみました(音量注意。あと画質悪いのはあしからず。元動画残っているはずなので今度そっちをアップしたいな、と)。

作業時間記録アプリの紹介動画

具体的なコードについては外仕事が終わって帰ってきてから示せれば、と思います。
それまでに他の方から回答が得られれば私が示す必要はなくなりますけれどね。
方針としては、onCellEdit トリガーを設定して、セルの編集があったときにスクリプトが起動するようにするわけですが。

あ、それとも、今のコードをそのまま貼っちゃおうかな。Phukuoka さんのやりたいことに合わせたものになりませんが、参考になる点はあるでしょうから。

javascript

1var COL_DAY = 1; 2var COL_WORKER = 3; 3var COL_START_TIME = 4; 4var COL_END_TIME = 5; 5var COL_SUSPENTION_TIME = 6; 6var COL_SPAN = 7; 7var COL_CHOP = 8; 8var COL_PROJECT = 9; 9var COL_FIELD = 10; 10var COL_DETAIL = 11; 11 12function onCellEdit(e) { 13 var cell = e.range; 14 // cell = SpreadsheetApp.getActiveRange(); 15 if (cell.getNumRows() > 1 || cell.getNumColumns() > 1) { 16 return; 17 } 18 var col = cell.getColumn(); 19 var row = cell.getRow(); 20 var v = e.value; 21 var sheet = cell.getSheet(); 22 function castNum(a) { 23 return a.replace(/[0123456789]/g 24 , function(a){ 25 var b = "0123456789".indexOf(a); 26 return (b !== -1)? b:a; 27 } 28 ); 29 } 30 31 if (COL_PROJECT <= col && col <= COL_DETAIL) { 32 var castedV = castNum(v); 33 if ((2 < v && v < row) || (2 < castedV && castedV < row)) { 34 var startRow = castedV; 35 var range = sheet.getRange(startRow, COL_PROJECT, row - startRow + 1, COL_DETAIL - COL_PROJECT + 1); 36 var values = range.getValues(); 37 var sourceIndex = 0; 38 var targetIndex = row - startRow; 39 values[targetIndex][COL_PROJECT - COL_PROJECT] = values[sourceIndex][COL_PROJECT - COL_PROJECT]; 40 values[targetIndex][COL_FIELD - COL_PROJECT] = values[sourceIndex][COL_FIELD - COL_PROJECT]; 41 values[targetIndex][COL_DETAIL - COL_PROJECT] = values[sourceIndex][COL_DETAIL - COL_PROJECT]; 42 range.setValues(values); 43 } 44 return; 45 } 46 if (col < COL_START_TIME || COL_SUSPENTION_TIME < col) { 47 return; 48 } 49 var range1 = sheet.getRange(row - 1, COL_DAY, 2, 1); 50 var values1 = range1.getValues(); 51 var isDirty1 = false; 52 var range2 = sheet.getRange(row - 1, COL_WORKER, 2, COL_SUSPENTION_TIME - COL_WORKER + 1); 53 var values2 = range2.getValues(); 54 var isDirty2 = false; 55 var index2 = col - COL_WORKER; 56 57 function setDay(day) { 58 if (day == '') return; 59 if (values1[1][0] == '') { 60 values1[1][0] = day; 61 isDirty1 = true; 62 } 63 } 64 65 function setWorker(worker) { 66 if (worker == '') return; 67 if (values2[1][0] == '') { 68 values2[1][0] = worker; 69 isDirty2 = true; 70 } 71 } 72 73 function sync() { 74 if (isDirty1) range1.setValues(values1); 75 if (isDirty2) { 76 range2.setValues(values2); 77 range2.setNumberFormats([ 78 ',[h]:mm,[h]:mm,[h]:mm'.split(','), 79 ',[h]:mm,[h]:mm,[h]:mm'.split(',') 80 ]); 81 } 82 } 83 84 if (v == 'z' || v == 'z') { 85 if (col == COL_START_TIME || col == COL_END_TIME) { 86 var now = new Date(); 87 cell.setValue(now.getHours() + ':' + now.getMinutes()); 88 cell.setNumberFormat("[h]:mm"); 89 setDay(now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate()); 90 } 91 sync(); 92 return; 93 } 94 if (v == 't' || v == 't') { 95 var endRow = row - 1; 96 var beginRow = endRow - 50; 97 if (beginRow < 2) beginRow = 2; 98 if (endRow < beginRow) endRow = beginRow; 99 var rowNum = endRow - beginRow + 1; 100 var values3 = sheet.getRange(beginRow, COL_DAY, rowNum, COL_SPAN - COL_DAY + 1).getValues(); 101 var i = rowNum - 1; 102 function ut(d) { 103 d = values3[i][0]; 104 if (d.getTime) return d.getTime(); 105 return; 106 } 107 var ut0 = ut(); 108 var K = function(){ 109 this.m = 0; 110 this.h = 0; 111 this.add = function(d) { 112 this.m += d.getMinutes(); 113 this.h += d.getHours(); 114 }; 115 this.get = function() { 116 var rest = this.m % 60; 117 var mmm = this.m - rest; 118 var hh = this.h + (mmm / 60); 119 hh = '0' + hh; 120 hh = hh.slice(-2); 121 rest = '0' + rest; 122 rest = rest.slice(-2); 123 return hh + ':' + rest; 124 }; 125 }; 126 var k = new K(); 127 while (i > -1) { 128 if (ut() != ut0) break; 129 k.add(values3[i][COL_SPAN - COL_DAY]); 130 i--; 131 } 132 var day = values1[0][0]; 133 setDay(day); 134 setWorker(values2[0][0]); 135 values2[1][COL_START_TIME - COL_WORKER] = ''; 136 values2[1][COL_END_TIME - COL_WORKER] = k.get(); 137 values2[1][COL_SUSPENTION_TIME - COL_WORKER] = ''; 138 isDirty2 = true; 139 sync(); 140 sheet.getRange(row, COL_DETAIL).setValue('【合計時間】'); 141 return; 142 } 143 v = castNum(v); 144 if (! v.match(/^\d{1,4}$/)) { 145 return; 146 } 147 v = '000' + v; 148 v = v.slice(-4, -2) + ':' + v.slice(-2); 149 values2[1][index2] = v; 150 isDirty2 = true; 151 if (col == COL_END_TIME && values2[1][COL_START_TIME - COL_WORKER] == '') { 152 values2[1][COL_START_TIME - COL_WORKER] = values2[0][COL_END_TIME - COL_WORKER]; 153 setDay(values1[0][0]); 154 setWorker(values2[0][COL_WORKER - COL_WORKER]); 155 } 156 if (values1[1][0] == '') setDay(values1[0][0]); 157 if (values2[1][0] == '') setWorker(values2[0][0]); 158 sync(); 159}

投稿2016/04/20 01:00

unau

総合スコア2468

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問