外出自粛中でも楽しく過ごす!QAまとめ>>

Google Apps Scriptにて、
勤怠管理をしようとしています。

残業時間を算出しようと、
スクリプトで、
終業時間から、稼働時間を引き算しましたが、

#NUM!

とスプレッドシートに表示されてしまいます。

ネットでも調べてみたのですが、
それらしい記述がないので、

どなたか、
同じ事をしたかたがいらっしゃいましたら、

ご教授願えませんでしょうか?

初心者につき、
ご無礼がありましたら、
ごめんなさい。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>hh:mm形式にするには



得られるのは秒数換算された値です。値を1時間の秒数(60 * 60)で割れば時数が得られます。そのあまりを1分の秒数(60)で割れば分数が得られます。
    • good
    • 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を調べてみるといいでしょう。

この回答への補足

初心者で申し訳ありません。

var a = d1.getTime();
var b = d2.getTime();
var d = (b - a) / 1000;

で得られる、
dを
hh:mm形式にするには

どうしたらいいのでしょうか?

補足日時:2014/07/28 06:51
    • good
    • 0

これだけではなんとも返事のしようがないです。

どうやって計算しているのでしょうか。

セルに日時の値が書かれているなら、それぞれのgetTimeで経過ミリ秒数を取得し、引き算すればいいと思います。例えばですが。

function timeAsubB(a,b){
return (a.getTime()-b.getTime()) / 1000;
}

例えばこんな感じでスクリプトを用意しておき、セルに、

timeAsubB(A1, A2)

こんな具合に設定すれば、A1とA2の日時の差を秒数換算した値が表示されます。そういうことでしょうか?

この回答への補足

詳しく、記述します。

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); // 残業時間


以上ですが、
お分かりになりますでしょうか?

よろしくお願いします

補足日時:2014/07/27 20:18
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QGoogle Apps Scriptの日付の比較

日付の比較を行うには、

どのようにしたらよろしいでしょうか?

比較対象セルには、
yyyy/mm/dd表示形式が設定されています。

単純に、d1 == d2
だと、できません。

よろしくお願いします。

Aベストアンサー

前に確か回答したと思いますが……。

2つのセルに日付のフォーマットが設定されているのでしたら、それをもとにDateオブジェクトを作成し、そこからgetTimeでミリ秒換算した値を取り出して引き算すればいいです。得られた結果を1日のミリ秒数で割れば日数が得られます。

function testfunc(e) {
var sheet = SpreadsheetApp.getActiveSheet(); // とりあえずアクティブシートを指定
var r1 = sheet.getRange(1, 1); // 1つ目のセル
var r2 = sheet.getRange(2, 1); // 2つ目のセル
var d1 = new Date(r1.getValue()); // Dateを作成
var d2 = new Date(r2.getValue()); // Dateを作成
var dt = Math.abs(d1.getTime() - d2.getTime()); // ミリ秒数値を引き算
var d = dt / (1000 * 60 * 60 * 24); // 1日のミリ秒数で割り算
Logger.log(d + "日 "); // ログに出力
}

前に確か回答したと思いますが……。

2つのセルに日付のフォーマットが設定されているのでしたら、それをもとにDateオブジェクトを作成し、そこからgetTimeでミリ秒換算した値を取り出して引き算すればいいです。得られた結果を1日のミリ秒数で割れば日数が得られます。

function testfunc(e) {
var sheet = SpreadsheetApp.getActiveSheet(); // とりあえずアクティブシートを指定
var r1 = sheet.getRange(1, 1); // 1つ目のセル
var r2 = sheet.getRange(2, 1); // 2つ目のセル
var d1 = new Date(...続きを読む

Q(google apps script)スプレッドシートを配列取り込みした時のエラーメッセージ

google apps scriptをスプレッドシートでマクロ代わりに使用しています。

スプレッドシートの内容全体を配列取り込みし、
for文で上のセルから検索文字列に合うものを別の配列に追加するスクリプトを書きたいのですが、

var sheet_values = sheet.getDataRange().getValues();
var arry = [];
var s = '検索文字列';

for( i = 0 ; i < lastRow ; i++){
var v = sheet_values[i][15]; //15は検索したい列です
if( v === s ) {
arry.push(i);
}
}

のように記述すると
「TypeError: undefined からプロパティ「15」を読み取れません。」
というエラーメッセージが出ます。

var clmn_values = sheet.getDataRange(1,16,lastRow,1).getValues();
var arry = [];
var s = '検索文字列';

for( i = 0 ; i < lastRow ; i++){
var v = clmn_values[i]; //15は検索したい列です
if( v === s ) {
arry.push(i);
}
}

以上のように検索列単体で取り込みしてfor文にする場合このエラーメッセージは出ないのですが、
列で取り込むものがかなり多くなってしまうのでできれば全体から検証したいです。

何卒お答えいただけますと幸いです。よろしくお願いします。

google apps scriptをスプレッドシートでマクロ代わりに使用しています。

スプレッドシートの内容全体を配列取り込みし、
for文で上のセルから検索文字列に合うものを別の配列に追加するスクリプトを書きたいのですが、

var sheet_values = sheet.getDataRange().getValues();
var arry = [];
var s = '検索文字列';

for( i = 0 ; i < lastRow ; i++){
var v = sheet_values[i][15]; //15は検索したい列です
if( v === s ) {
arry.push(i);
}
}

のように...続きを読む

Aベストアンサー

こんにちは

google apps scriptは存じませんので、ご質問文を見た範囲での回答となっており、はずしているかも知れませんが・・・

>「TypeError: undefined からプロパティ「15」を読み取れません。」
とのことなので、 sheet_values[i]がundefinedかあるいは読み取れないなどと推測できます。

データを読み込んで解析するのに、いきなり「lastRow」や「15」を指定して読み出そうとなさっていますが、元データに空の行があったり、空のセルがある場合に、そもそも、どのような値が返されてくる仕様になっているのでしょうか?
通常で考えれば、(どこか他で決めている?)lastRowではなく、sheet_values.length等を用いてループするのが妥当ではないかと思いますが…

googleのリファレンスで見てみると、データサイズは当該配列のサイズを参照してループしていますし、個々のセルの値についても存在をチェックして処理を行うようにしているようです。
https://developers.google.com/apps-script/reference/spreadsheet/sheet#getDataRange%28%29

こんにちは

google apps scriptは存じませんので、ご質問文を見た範囲での回答となっており、はずしているかも知れませんが・・・

>「TypeError: undefined からプロパティ「15」を読み取れません。」
とのことなので、 sheet_values[i]がundefinedかあるいは読み取れないなどと推測できます。

データを読み込んで解析するのに、いきなり「lastRow」や「15」を指定して読み出そうとなさっていますが、元データに空の行があったり、空のセルがある場合に、そもそも、どのような値が返されてくる仕様になってい...続きを読む

QJavaScriptde途中で、「exit」するには?

function kensaku(){
s_data = document.kaiin_form.input_name.value;

if(!s_data){ alert("キーワードを入れて下さい!"); }

if(s_data != dumy){ ...... }
for(i=st_no;i<=n;i++){
......省略.................;
.......省略................}
}

----------------------------------
3行目で表示されたアラートをOKで閉じても、4行目以下が実行されてしまいます。
3行目でexitするにはどうすれば良いでしょうか?

Aベストアンサー

>関数(kensaku())からは抜けられませんでした。
そうですね、勘違いしていました、f(^^;
すみません。
if(!s_data){
alert("キーワードを入れて下さい!");
return;
}
ですね。

Q【GAS】Split関数で空白文字を認識しない。

質問板の乱立恐れ入ります。
納期がさしせまっていましてお分かりでしたら、ご教示頂けるとさいわいです。
以下のA1セルから、綺麗にメールアドレスを三つB2.C2,D2に取り出したいです。
ですが、現状下記の状態となっています。

________________________________
A1のセル
1000xxxx1@shop.rakuten.co.jp 1000xxxx2@rakuten.co.jp 1000xxxx3@shop.rakuten.co.jp

B2のセル
=SPLIT(A2,"/(^\s+)|(\s+$)/g")

結果
B2のセル
1000xxxx1@

C2のセル
shop.rakuten.co.jp 1000xxxx2@rakuten.co.jp 1000xxxx3@

D2のセル
shop.rakuten.co.jp

これは、文字コードの問題ですか?それとも正規表現かな?

もしお分かりでしたら、相談させて頂ければ幸いです。

Aベストアンサー

ちなみに、エクセルでしたら区切り位置でスペースを指定すれば各セルに分けてくれます。

QJavaScriptで文字列の特定文字以降を取得する方法

変数 url に以下のような文字列が代入されています。
var url='http://www.example.com?id=2&page=3';

ここから?以降の文字列だけを取得したいのですが、どのようにすれば良いのでしょうか?
「id=2&page=3」←このような結果が欲しいです。

ブラウザのurlから直接?以降を取得するには location.search を使えば良いというのは調べてわかりましたが、変数に文字列としてurlが代入された場合の方法がわかりません。

ご回答よろしくお願いいたします。

Aベストアンサー

文字列から抽出するのであれば、indexOfを使うか正規表現かでしょうね
深く考えなければ前者、複雑なデータを取りたいなら後者でしょうか

<script>
var url='http://www.example.com?id=2&page=3';
if(url.indexOf("?")>=0){
var str1=url.substring(url.indexOf("?")+1,url.length);
}
document.write(str1+"<br>");

var reg=new RegExp("\\?(.+?)$");
if(url.match(reg)){
var str2=url.match(reg)[1];
}
document.write(str2);
</script>

QGoogleスプレッドシートで特定のセルが条件を満たした時に指定したアドレスにメールを送る

GoogleスプレッドシートでTODOリストを作成しています。

たとえばタスクの期限が近づいてきた時に(3時間前など)に指定したメールアドレスにメールを
送る(ハングアウトで通知されるとか、ユーザーに直接連絡が行けばなんでも構いません)
ようなスクリプトや、条件付き書式設定など?

方法はございますでしょうか?

スプレッドシートだけでなくても、GoogleカレンダーやIFTTTなどといった他のサービスとの複合でもアイデアがあればぜひご教授頂きたく存じます。

Aベストアンサー

独学がてら原理動作を作ってみました。(添付画像、後記スクリプト)
太字の日時を現在日時の3時間前後に設定し、「期限チェック」ボタンを押すと、期限まで3時間以内なら添付画像のように「警告」表示されメールが送信されました。
注意点は、期限の表示形式を本来の日付や日時にすると判定ができなかったため書式なしテキストとしました。

スプレッドシートを開いたイベントに処理を割り当てるという仕組みは見つけられませんでした。
周期処理も同様のため、自動ではなく上記のようにボタンを押すという手動の実装を行いました。
当然開きっぱなしでは実行されないことになります。

メールについては、下記も参考になります。
https://developers.google.com/apps-script/overview#set_it_up

セルの読みは下記が参考になります。
https://developers.google.com/apps-script/guides/sheets#reading_data

GoogleスクリプトはベースはJavascriptのようなので、Javascriptの仕様も参考になると思います。

あとは、上記等、勉強して補って下さい。
Googleの捨てアカウントがあるなら、原理動作したものを編集者権限(動作させることができる)で共有できます。

ちなみにここまで作って気づきましたが、Googleカレンダーの予定にメールの通知機能があります。
ただ、通知は最短で1日前です。
でも、ポップアップによる通知も設定できるため、もしかしたらこちらは開きっぱで通知されるかもしれません。
とはいえ、1日前にポップアップされてもですが。。。

-----スクリプト
function CheckExpiration() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
expire = new Date(data[1][1]);
now = new Date();
timeExpire = expire.getTime();
timeNow = now.getTime();
judge = sheet.getRange("C2");
judge.setValue("");

if (timeExpire - timeNow <= 1000 * 60 * 60 * 3)
{
judge.setValue("警告")
Notify();
}
}

function Notify()
{
// Create a new Google Doc named 'Hello, world!'
var doc = DocumentApp.create('Hello, world!');

// Access the body of the document, then add a paragraph.
doc.getBody().appendParagraph('This document was created by Google Apps Script.');

// Get the URL of the document.
var url = doc.getUrl();

// Get the email address of the active user - that's you.
var email = Session.getActiveUser().getEmail();

// Get the name of the document to use as an email subject line.
var subject = doc.getName();

// Append a new string to the "url" variable to use as an email body.
var body = 'Link to your doc: ' + url;

// Send yourself an email with a link to the document.
// GmailApp.sendEmail(email, subject, body);
Logger.log("Send Email");
}

独学がてら原理動作を作ってみました。(添付画像、後記スクリプト)
太字の日時を現在日時の3時間前後に設定し、「期限チェック」ボタンを押すと、期限まで3時間以内なら添付画像のように「警告」表示されメールが送信されました。
注意点は、期限の表示形式を本来の日付や日時にすると判定ができなかったため書式なしテキストとしました。

スプレッドシートを開いたイベントに処理を割り当てるという仕組みは見つけられませんでした。
周期処理も同様のため、自動ではなく上記のようにボタンを押すという手動の実...続きを読む

QGoogleスプレッドシートでセルの文字数の関数

こんにちは。
エクセル系にあまり詳しくないもので教えてください。

現在Googleスプレッドシートを使っているのですが、
セルに入力した文字の「文字数」を表示したいです。

例えばA1セルに500文字日本語を入力していると、
A2セルに「500」と出るようにしたいのですが、
この場合どのような関数を書けばよいでしょうか?

詳しい方ご伝授いただけると助かります。
宜しくお願い致します。

Aベストアンサー

=len(セルの番号)でできませんか?

Qスプレッドシートでドロップダウンリストの内容を自動更新させたい

http://office-qa.com/Excel/ex68.htm
こちらのサイトの方法をスプレッドシートで行いたいのですが上手くいきません。

A列に記入(月に何度か追加される)したものを、B列のプルダウンの項目に反映させて記入がしたいです。
A1にあるりんごをB列だとB2に表示させなければいけない時があるため、A列にあるものを隣のB列にそのまま反映させたいわけではないです。

A列       B列(プルダウン)
1.りんご     もも
2.ばなな     りんご
3.もも      ばなな
4.かき(追加)

Aベストアンサー

関数を使ったリストではなく、[名前付き範囲]を使ってみては。

設定例:A列にリストに表示させる項目が追加される場合
メニューの[データ]→[名前付き範囲]を選択。
表示された[名前付き範囲]ウィンドウの「名前付けされた範囲1」を
適当な名前「果物」にします。リストの範囲が[ 'シート1'!A1 ]に
なっていたら、[ 'シート1'!A1:A1000 ]のように追加される品数で
用意し[完了]で決定します。

プルダウンを表示したい範囲を選択して、データ→入力規則から
[データの入力規則]を出し、[セル範囲]をB列の範囲を指定します。
[条件]を[リストの範囲]で指定にして、範囲を「果物」とします。
[保存]ボタンを押すと、プルダウンがB列の範囲に表示されます。

A列で入力されていない範囲はプルダウンに表示されません。
A列にデータを追加をすると、プルダウンのリストも増えます。

Q時間の比較は可能でしょうか?

<form name="time_hikaku">
開始時刻
<input type="text" name="hour" maxlength="2">
<input type="text" name="min" maxlength="2">
終了時刻
<input type="text" name="end_hour" maxlength="2">
<input type="text" name="end_min" maxlength="2">
</form>

で入力した時刻を比較し、終了時刻が開始時刻
より小さい場合にAlert表示したいのですが、
どうすれば、Javascriptで時刻比較できますでしょうか?
09:00 8:00など、0が入力される可能性もあるので、
時間関数などがあればできそうですが。。

Aベストアンサー

それぞれの時刻を「分」に直して数値比較してはどうでしょうか。

# スクリプト部
function checkTime(f) {
  // + f.min.value だと文字列連結になってしまうので、- 0 で数値化する。
  var stime = f.hour.value * 60 + (f.min.value - 0);
  var etime = f.end_hour.value * 60 + (f.end_min.value - 0);

  if (stime > etime) {
    alert("時刻を正しく入力してください。");
    return false;
  }
  return true;
}

# フォーム部
<form name="time_hikaku" onSubmit="return checkTime(this)">
※onSubmitから、trueを返せば送信、falseを返せば送信キャンセルとなる。

ここでは送信時にチェックするように書きましたが、好みのタイミングでcheckTimeを呼び出せばOKです。
その際、引数にはフォームオブジェクトを指定してください。

それぞれの時刻を「分」に直して数値比較してはどうでしょうか。

# スクリプト部
function checkTime(f) {
  // + f.min.value だと文字列連結になってしまうので、- 0 で数値化する。
  var stime = f.hour.value * 60 + (f.min.value - 0);
  var etime = f.end_hour.value * 60 + (f.end_min.value - 0);

  if (stime > etime) {
    alert("時刻を正しく入力してください。");
    return false;
  }
  return true;
}

# フォーム部
<form name="time_hikaku" onSubmi...続きを読む

Qエクセル関数で日付かどうかの確認?

ワークシート関数でセル内が日付かどうか調べるものはないでしょうか?
VBAのIsDateなら存じておりますが。

Aベストアンサー

日付を表すデータは、セルの値としては、単なる数値なのですが、どういう種類のセルの書式が設定されているかを調べることはできます。
調べたいセルがA1だとして
=cell("format",A1)

"D1"になれば概ね日付だと判別できます。
時刻を含めたものにする場合は、
Dで始まることをチェックすればいいかも。
詳しくは、CELL関数のヘルプを参照してください。


人気Q&Aランキング