• ベストアンサー

Google Apps Scriptの時刻の計算

Google Apps Scriptにて、 勤怠管理をしようとしています。 残業時間を算出しようと、 スクリプトで、 終業時間から、稼働時間を引き算しましたが、 #NUM! とスプレッドシートに表示されてしまいます。 ネットでも調べてみたのですが、 それらしい記述がないので、 どなたか、 同じ事をしたかたがいらっしゃいましたら、 ご教授願えませんでしょうか? 初心者につき、 ご無礼がありましたら、 ごめんなさい。

質問者が選んだベストアンサー

  • ベストアンサー
noname#247307
noname#247307
回答No.3

>hh:mm形式にするには 得られるのは秒数換算された値です。値を1時間の秒数(60 * 60)で割れば時数が得られます。そのあまりを1分の秒数(60)で割れば分数が得られます。

その他の回答 (2)

noname#247307
noname#247307
回答No.2

> if ( a1 >= "20:55" && a1 <= "21:55" ){ この最初の部分で既に変です。テキストと比較していますよ? "20:55"というテキストと比較しても意味がありません。テキストは、テキストですから。日時の値ではありませんし比較演算子で比較することもできません。 まず、日時と、比較する日時をそれぞれDateオブジェクトとして取得し、そこから経過ミリ秒数を取得して計算をしなくてはいけません。 例えばですが。比較する2つのDateオブジェクトを用意します。 var d1 = new Date(); var d2 = new Date(); d1.setHours(1); // 時を設定 d1.setMinutes(30); // 分を設定 d2.setHours(12); // 時を設定 d2.setMinutes(34); // 分を設定 こんな感じで比較するDateオブジェクトを2つ用意し、 var a = d1.getTime(); var b = d2.getTime(); var d = (b - a) / 1000; こうしてそれぞれの経過ミリ秒数の値を取得して計算をすれば、時間が得られるでしょう。 このあたりはJavaScriptの日時計算そのままですから、JavaScriptを調べてみるといいでしょう。

tabokutora
質問者

補足

初心者で申し訳ありません。 var a = d1.getTime(); var b = d2.getTime(); var d = (b - a) / 1000; で得られる、 dを hh:mm形式にするには どうしたらいいのでしょうか?

noname#247307
noname#247307
回答No.1

これだけではなんとも返事のしようがないです。どうやって計算しているのでしょうか。 セルに日時の値が書かれているなら、それぞれのgetTimeで経過ミリ秒数を取得し、引き算すればいいと思います。例えばですが。 function timeAsubB(a,b){ return (a.getTime()-b.getTime()) / 1000; } 例えばこんな感じでスクリプトを用意しておき、セルに、 timeAsubB(A1, A2) こんな具合に設定すれば、A1とA2の日時の差を秒数換算した値が表示されます。そういうことでしょうか?

tabokutora
質問者

補足

詳しく、記述します。 if ( a1 >= "20:55" && a1 <= "21:55" ){  実働時間を稼働時間から、休憩時間を引いて求めています var jitdo = (kado - st.getRange(6,2).getValue()) / (1000*60*60*24);  シートに定時時間を設定します sheet.getRange(i,5).setValue("8:00");  稼働時間から、実働時間を引いて、残業時間を求めています  var y = ( a1 - jitdo );  シートに設定すると、#NUM! と表示されます sheet.getRange(i,6).setValue(y); // 残業時間 以上ですが、 お分かりになりますでしょうか? よろしくお願いします

関連するQ&A

  • 「Google Apps Script」について

    Googleスプレッドシートの「Google Apps Script」についての質問です。 イベントなんですが、「セルが選択された」とか「セルにフォーカスがあたった」とかいうイベントはあるんですか。 ないとすれば何かやりようはありますか。カーソルの移動したセルを赤くしたいんです・・・・。

  • Google apps scriptについて

    Googleドライブのスプレッドシートで作成したスケジュールをGoogleカレンダーに反映するGoogle apps scriptを作成したいと思っています。 下記のサイトが、ほぼイメージに近いのですが、コチラのコードでは、時間の指定ができません。 ○時から○時までという時間の指定をするには、どのようにコードを追加すればよろしいですか? http://pc.nikkeibp.co.jp/article/column/20140210/1120685/?P=6 以上よろしくお願いします。

  • Google Apps ScriptとVBA

    Google Apps Scriptでスプレッドシートの操作をしたいと考えました。VBAだと、クラウド環境で動作しないためです。しかし、Google Apps Scriptの情報はほとんどありません。ある程度プログラミングの知識があれば応用が利いてなじめるのかもしれませんが、基本的に知識もそこまでなく、行き詰まっています。VBAだと、少しは経験があるので何とかできると思うのですが。 Google Apps ScriptとVBAとは違うものだとは理解していますが、VBAで組んで置いてから、その考え方をGoogle Apps Scriptに反映させると言う考え方と言うのは間違っていますか?まったく異なる言語だと言うことは認識していますが、VBAの動きをGoogle Apps Scriptのものに置き換えると言う意味です。(うまく表現できませんが) ただエクセルがどの環境にもあれば、VBAでも良いと思いますが、エクセルがない状況を想定すると Google Apps Scriptと言う選択肢になるのですが。どうも、日本のフォーラムは閉鎖され、アメリカのフォーラムに誘導され、そこからまた外部のサイトに誘導されてしまい、手詰まりになってしまいました。ドキュメントも何とか読もうとしていますが、基礎がないので苦労しています。

  • google apps scriptでメール送信

    google apps scriptでスプレッドシートを添付ファイルで送る方法をお教えください。 google apps scriptで SpreadsheetApp.getActiveSheet(); として取得しセルにデータを書き込んだスプレッドシートをEメール発信したいです。 sendEmail(送付先アドレス, タイトル, 内容, options); とすると思いますが、optionsの書き方がわかりません。 よろしくお願いします。 2012 Sep. 25.

  • google apps scriptについて

    google apps scriptに関しては全くの初心者ですので、どなたかお力をお貸しください。 現在、Accessでシステムを作っているのですが、システムに新規案件が登録されると自動でグーグルカレンダーにも登録されるようにしています。 具体的には、システムに新規案件が登録されたタイミングで件名を「★マーク+タイトル+日付+時間」、内容に案件詳細を入れたメールをgmailに送り、google apps scriptのトリガーで一定間隔でメールを検索し、件名に★マールの入ったメールがあれば件名に入っている日付・時間でカレンダーに内容を登録するようになっています。 そこで質問なのですが、今度はシステムより同じ内容のメールを送り、そのメール内容と同じものがカレンダーで見つかるとその予定を削除するようなgoogle apps scriptを作りたいのです。 メールのサンプルとgoogle apps scriptのコードは下記のようになっています。 全くの初心者でコードもネットを色々調べて書いたのであまり内容も理解できていません。 どなたか宜しくお願い致します。 メールサンプル 件名: ★取引先と打合せ 2015/08/02_16:00-18:00 内容: 管理NO 9016 2015/08/02 16:00-18:00 発注担当者:様 場所:事務所 登録日:2015/06/19/11:51 コード function setCalLab(){ var thds = GmailApp.getInboxThreads(); var calName = "メールアドレス@gmail.com"; var cals = CalendarApp.getCalendarsByName(calName); for(var n in thds){ var thd = thds[n]; var subject = thd.getFirstMessageSubject(); var msgs = thd.getMessages(); if (subject.indexOf("★",0) != -1){ //label.addToThread(thd); //for(var m in msgs){ var msg = msgs[0]; var body = msg.getPlainBody(); var str = msg.getSubject(); var res = str.match(/\d+/g); var cal = cals[0]; var d1 = new Date(); var yy = d1.getFullYear(); cal.createEvent(str,new Date(res[0],res[1]-1,res[2],res[3],res[4]),new Date(res[0],res[1]-1,res[2],res[5],res[6]),{description:body,sendInvites:false}); //} GmailApp.moveThreadToArchive(thd); } } }

  • Google Apps Scriptの記述

    フォームに入力したら、フォームに基づいてメールを送れるようにしたいと考えています。 そこで次のScriptを記述しました。しかし、フォームに入力し終わってもメールが送信されません。 Google Apps Scriptの参考サイトも無い事と、Googleも仕様を次々新しくしているので持っている書籍があまり参考になりません。 トリガーは次の通りです。 現在のプロジェクトのトリガーで、実行 mySendhokoku イベントスプレッドシートからフォーム送信時 としています。 scriptは function mySendhokoku(e) { var mail_to=e.nameValues["送信先"]; var datetime= new Date(); var hokoku=e.nameValues["報告種類"]; var kaisi=e.nameValues["開始時間"]; var shuryo=e.nameValues["終了時間"]; var kyukei=e.nameValues["休憩時間"]; var biko=e.nameValues["本文備考"]; var today=formatDate(datetime,"MM/dd"); var subject=hokoku+"連絡"+today+"名前"; var body="名前"+"\n\n"; var body=body+"開始時刻"+kaisi+"\n\n"; var body=body+"終了時刻"+shuryo+"\n\n"; var body=body+"休憩時間"+kyukei+"\n\n"; var body=body+biko+"\n\n"; MailApp.sendEmail(mail_to,subject,body); } ちなみに”名前”と言うところは実際は私の名前が入っています。読み替えてください。 日付は5/5などの様に記述したいと思っています。 初心者で至らない点ありますが、よろしくお願いいたします。

  • Google Apps Scriptについて

    Google Apps Scriptについては全くの初心者です。どなたか知恵をお借りしたいです。 accessを使い業務システムを作っているのですが、これまでgoocalproxyというサービスを使い、新規受注を入力すれば、その内容をgmailに飛ばし、自動でグーグルカレンダーに登録させてました。このgoocalproxyが数日前から機能しなくなり、色々調べた結果Google Apps Scriptを使って登録する方法を見つけたのですが、全くの初心者の為、ネットで参考にしたサンプルのコピペしかできず、下記のようなコードを使用しております。 function setCalLab(){ //var dstr = "本日の予定"; //var label = GmailApp.createLabel(dstr); var thds = GmailApp.getInboxThreads(); var calName = "本日の予定"; var cals = CalendarApp.getCalendarsByName(calName); for(var n in thds){ var thd = thds[n]; var subject = thd.getFirstMessageSubject(); var msgs = thd.getMessages(); if (subject.indexOf("本日の予定",0) != -1){ //label.addToThread(thd); //for(var m in msgs){ var msg = msgs[0]; var body = msg.getPlainBody(); var str = msg.getSubject(); var res = str.match(/\d+/g); var cal = cals[0]; var d1 = new Date(); var yy = d1.getFullYear(); var dd = new Date(yy,res[0]-1,res[1]); cal.createAllDayEvent(str,dd,{description:body}); //} GmailApp.moveThreadToArchive(thd); } } } これですと、カレンダーに自動登録は出来るのですが、終日の予定になってしまいます。 やりたい事は、gmail宛てに予定の件名、日付、開始時間、終了時間を送りそれを自動でグーグルカレンダーに開始時間から終了時間までの予定で反映させたいと思っています。 別のサイトで、 function createEvent(){ var calendar = CalendarApp.getCalendarById('xxxxxxxxxx@group.calendar.google.com'); calendar.createEvent('歯医者', new Date('2012/3/12 18:00:00'), new Date('2012/3/12 20:00:00')); } 時間指定のほかに、予定の概要、場所情報を設定することもできる。 function createEvent2(){ var calendar = CalendarApp.getCalendarById('xxxxxxxxxx@group.calendar.google.com'); calendar.createEvent('歯医者', new Date('2012/3/12 18:00:00'), new Date('2012/3/12 20:00:00'), {description: '概要', location: '◯◯病院'} ); } というような情報も見つけたのですが、幾分全くの初心者の為、これをどうすれば思い通りのコードになるのかわかりません。 どなたかご教授お願い致します。

  • スクリプトについて、ご回答をお願いいたします。

    スクリプト初心者です。。。 どなたかご教示いただけますと幸いです。 スプレッドシートにて勤怠管理シートを作成しています。 チャットワークからの打刻データ(時間と社員ID)をもとに、それをスプレッドシートに出力するというスクリプトです。 スクリプトを組んでみたのですが、 動作は無事にしているのですが、 ”データ”シートのE列・F列、つまりは打刻時間が表示される部分に 通常では、時間のみ(10:00)という打刻のみ表示されるようスクリプトを組んでいるはずのなのですが、 1899/12/31 10:07:00といったように日付と時間それぞれが打刻されてしまい、 勤怠管理シートの計算がうまくいかないようになってしまいました。 スプレッドシートの表示切替を10:00などにしても、 入力されているデータが上記日付と時間のため、 上手く計算が実行されないのです……。 お忙しいところ、大変恐縮ではございますが、 どなかたご教示お願いできますでしょうか…?

  • エクセルで時間外計算の仕方

    始業から終業時間がまちまちで、下記のような表を作成したいのですが上手くいきません。 何かいい方法はありましたら教えてくださいm(__)m 作りたい表↓ 超過時間は10時間以上、15分未満切捨てとし、残業代は1時間当り500円とした場合 始業時間  終業時間 稼動時間  超過時間   残業代  7:00    18:15    11:12     1:00       500  5:00    13:13     8:13      0:00         0 23:00     12:16    13:16       3:15        1625 作ってみて失敗した表↓ A1に10:00 B1に500と入力し A2に始業時間 B2に終業時間 C2に稼動時間 D2に残業時間 E2に残業代 として A2   B2      C3              D4                 E2 7:00   8:15  =FLOOR(B2+1-A2,"1:0")  =FLOOR(C3+1-A1,"0:15")  =D4*B1 ※稼動時間が10時間未満で残業がつかない場合の計算ができない ※残業時間に残業代を掛けた計算の計が違う 以上、IF関数を使えばいいのかとも思ったのですが、どう使えば有効なのかも判らずにおりました。 よろしくお願いします。   

  • GASでカレンダーの予定を削除する

    Google App Script初心者です。 Googleドライブのスプレッドシートで作成したスケジュールを Googleカレンダーに反映するGoogle apps scriptを作成したいのですが スプレッドシートの内容に予定を追加し、Googleカレンダーに反映すると 2回目以降は予定がダブってしまいます。(あたり前ですよね) そこでdeleteEventでカレンダーの予定を前もって削除したら良いのかと思ったのですがdeleteEventの使用法がわかりません。 deleteEventの前にカレンダーの何(ID?)を調べて削除するのかもよくわかりません。 deleteEventの使い方のコードを教えてください。 お願いします。