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

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

ただいまの
回答率

90.48%

  • Google

    633questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,469

Phukuoka

score 2

前提・実現したいこと

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

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

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

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

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

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

例)「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ラップ程度)
・ 上記を基に対比グラフを作成

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

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

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

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

var COL_DAY = 1;
var COL_WORKER = 3;
var COL_START_TIME = 4;
var COL_END_TIME = 5;
var COL_SUSPENTION_TIME = 6;
var COL_SPAN = 7;
var COL_CHOP = 8;
var COL_PROJECT = 9;
var COL_FIELD = 10;
var COL_DETAIL = 11;

function onCellEdit(e) {
  var cell = e.range;
  // cell = SpreadsheetApp.getActiveRange();
  if (cell.getNumRows() > 1 || cell.getNumColumns() > 1) {
    return;
  }
  var col = cell.getColumn();
  var row = cell.getRow();
  var v = e.value;
  var sheet = cell.getSheet();
  function castNum(a) {
    return a.replace(/[0123456789]/g
                     , function(a){
                       var b = "0123456789".indexOf(a);
                       return (b !== -1)? b:a;
                     }
                    );
  }

  if (COL_PROJECT <= col && col <= COL_DETAIL) {
    var castedV = castNum(v);
    if ((2 < v && v < row) || (2 < castedV && castedV < row)) {
      var startRow = castedV;
      var range = sheet.getRange(startRow, COL_PROJECT, row - startRow + 1, COL_DETAIL - COL_PROJECT + 1);
      var values = range.getValues();
      var sourceIndex = 0;
      var targetIndex = row - startRow;
      values[targetIndex][COL_PROJECT - COL_PROJECT] = values[sourceIndex][COL_PROJECT - COL_PROJECT];
      values[targetIndex][COL_FIELD - COL_PROJECT] = values[sourceIndex][COL_FIELD - COL_PROJECT];
      values[targetIndex][COL_DETAIL - COL_PROJECT] = values[sourceIndex][COL_DETAIL - COL_PROJECT];
      range.setValues(values);
    }
    return;
  }
  if (col < COL_START_TIME || COL_SUSPENTION_TIME < col) {
    return;
  }
  var range1 = sheet.getRange(row - 1, COL_DAY, 2, 1);
  var values1 = range1.getValues();
  var isDirty1 = false;
  var range2 = sheet.getRange(row - 1, COL_WORKER, 2, COL_SUSPENTION_TIME - COL_WORKER + 1);
  var values2 = range2.getValues();
  var isDirty2 = false;
  var index2 = col - COL_WORKER;

  function setDay(day) {
    if (day == '') return;
    if (values1[1][0] == '') {
      values1[1][0] = day;
      isDirty1 = true;
    }
  }

  function setWorker(worker) {
    if (worker == '') return;
    if (values2[1][0] == '') {
      values2[1][0] = worker;
      isDirty2 = true;
    }
  } 

  function sync() {
    if (isDirty1) range1.setValues(values1);
    if (isDirty2) {
      range2.setValues(values2);
      range2.setNumberFormats([
        ',[h]:mm,[h]:mm,[h]:mm'.split(','),
        ',[h]:mm,[h]:mm,[h]:mm'.split(',')
      ]);
    }
  }

  if (v == 'z' || v == 'z') {
    if (col == COL_START_TIME || col == COL_END_TIME) {
      var now = new Date();
      cell.setValue(now.getHours() + ':' + now.getMinutes());
      cell.setNumberFormat("[h]:mm");
      setDay(now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate());
    }
    sync();
    return;
  }
  if (v == 't' || v == 't') {
    var endRow = row - 1;
    var beginRow = endRow - 50;
    if (beginRow < 2) beginRow = 2;
    if (endRow < beginRow) endRow = beginRow;
    var rowNum = endRow - beginRow + 1;
    var values3 = sheet.getRange(beginRow, COL_DAY, rowNum, COL_SPAN - COL_DAY + 1).getValues();
    var i = rowNum - 1;
    function ut(d) {
      d = values3[i][0];
      if (d.getTime) return d.getTime();
      return;
    }
    var ut0 = ut();
    var K = function(){
      this.m = 0;
      this.h = 0;
      this.add = function(d) {
        this.m += d.getMinutes();
        this.h += d.getHours();
      };
      this.get = function() {
        var rest = this.m % 60;
        var mmm = this.m - rest;
        var hh = this.h + (mmm / 60);
        hh = '0' + hh;
        hh = hh.slice(-2);
        rest = '0' + rest;
        rest = rest.slice(-2);
        return hh + ':' + rest;
      };
    };
    var k = new K();
    while (i > -1) {
      if (ut() != ut0) break;
      k.add(values3[i][COL_SPAN - COL_DAY]);
      i--;
    }
    var day = values1[0][0];
    setDay(day);
    setWorker(values2[0][0]);
    values2[1][COL_START_TIME - COL_WORKER] = '';
    values2[1][COL_END_TIME - COL_WORKER] = k.get();
    values2[1][COL_SUSPENTION_TIME - COL_WORKER] = '';
    isDirty2 = true;
    sync();
    sheet.getRange(row, COL_DETAIL).setValue('【合計時間】');
    return;
  }
  v = castNum(v);
  if (! v.match(/^\d{1,4}$/)) {
    return;
  }
  v = '000' + v;
  v = v.slice(-4, -2) + ':' + v.slice(-2);
  values2[1][index2] = v;
  isDirty2 = true;
  if (col == COL_END_TIME && values2[1][COL_START_TIME - COL_WORKER] == '') {
    values2[1][COL_START_TIME - COL_WORKER] = values2[0][COL_END_TIME - COL_WORKER];
    setDay(values1[0][0]);
    setWorker(values2[0][COL_WORKER - COL_WORKER]);
  }
  if (values1[1][0] == '') setDay(values1[0][0]);
  if (values2[1][0] == '') setWorker(values2[0][0]);
  sync();
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

同じタグがついた質問を見る

  • Google

    633questions

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