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

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

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

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

Q&A

解決済

1回答

2354閲覧

GAS あるシートの前日日付の07:30~当日日付の07:30までのデータを別のシートへ貼り付けたい。

detch

総合スコア1

Google Apps Script

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

0グッド

1クリップ

投稿2021/10/18 10:56

編集2021/10/21 12:23

コード

GASで当日日付で07:30未満かつ前日日付07:30以上のデータが含まれる行を抽出して、別シートへ貼り付けたい。 ![![イメージ説明](7da6756ae204efde321ae56f8e7daab9.png)](5a3b7f2a877e5110a7ac66eb4c714f73.png) ### 発生している問題・エラーメッセージ 2次元配列でシートのデータを取得しましたが、日付の行、時間の列で判定して条件を満たしていたらその行を取得する方法がわかりません。

エラーメッセージ

### 該当のソースコード GAS ソースコード function myFunction() { //**********rb=robot管理票**********// //**********fb=障害一覧*************// //----------robot管理票のシート情報(コピー元)----------// var url = "マスキング"; var robotBook = SpreadsheetApp.openByUrl(url); var robotMgtSheet = robotBook.getSheetByName("管理"); //**----------障害一覧の情報(ペースト先)----------**// var failureBook = SpreadsheetApp.getActiveSpreadsheet(); var fS_Nissi = failureBook.getSheetByName("日誌用"); //**----------シートのコピペ→名前変更----------**// var getRobotMgtSheet = robotBook.getSheets()[1]; getRobotMgtSheet.copyTo(failureBook); var fbSheet = failureBook.getSheetByName("管理 のコピー"); fbSheet.setName("障害管理"); //**----------余分な列、行の削除処理**********// fbSheet.deleteColumns (1,7); fbSheet.deleteColumns (6,8); fbSheet.deleteColumns (8,5); fbSheet.deleteRow (1); fbSheet.setFrozenColumns(0); // fbSheet.deleteRows(100,3000); //**----------ステータス列の移動処理----------**// var cl = fbSheet.getRange(1,1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); var rng = fbSheet.getRange(cl,1); fbSheet.moveColumns(rng,4); //**----------発生日を降順でSORT----------**/ fbSheet.sort(1,false); //**----------日付の取得----------**// //現在日時のDateオブジェクトを作る var date = new Date(); //現在の「日」を取得し表示形式を整形する var day = date.getDate(); var today = Utilities.formatDate(date, 'JST', 'yyyy/MM/d'); //前日日付にしたいので-1する date.setDate(day-1); //日付の表示形式を整形する var yesterday = Utilities.formatDate(date, 'JST', 'yyyy/MM/d'); //**----------定義----------**// var okData_days = [] //発生日時の格納先 var aValues = fbSheet.getRange('A:A').getValues();  //"障害報告"の"発生日時"部分の値を全て取得 var lastRow = aValues.filter(String).length;  //空白の要素を除いた長さを取得 //**----------発生日が"前日"かつ"7:30以降を取得し貼り付け----------**// for(var i=1,y=1; i<lastRow; i++,y++){ var fbHASSEI_Day = fbSheet.getRange(i,1,1).getDisplayValue(); var fbHASSEI_Time= fbSheet.getRange(i,2,1).getDisplayValue(); var fbTime = fbHASSEI_Time.split(':'); if(yesterday == fbHASSEI_Day){ if(fbTime[0] == "07"){ if(fbTime[1] >= "30"){ var okData = fbSheet.getRange(i,1,1,7).getDisplayValues(); fS_Nissi.getRange(y+5,2,1,7).setValues(okData);} }else if (fbTime[0] > "07"){ var okData = fbSheet.getRange(i,1,1,7).getDisplayValues(); fS_Nissi.getRange(y+5,2,1,7).setValues(okData); } } } ### 試したこと for文を利用して、当日の日付かつ発生時間が07:30未満のものを判定し別シートへ貼り付けるコードを書きましたが、何度やっても貼り付ける行がずれたりしてしまう。当日だけの処理がうまくいっても前日の日付の判定をしたあとそのデータをどうすればよいのかか悩んでいます。 追記(2021/10/18 20:44) 最初は、シートの日付を判定し対象の者を別のシートへ1行ずつ貼り付ける処理を作っていました。 ただ、日付の判定+時間の判定が一致したときのみ貼り付ける処理にしてみたら貼り付け先シートの行がずれたりします。 追記(2021/10/18/23:39) //**----------発生日が"前日"かつ"7:30以降を取得し貼り付け----------**//の処理の部分は 判定の結果は欲しいデータになっていますが、貼り付け先(添付画像参照)のシートにこの式だと3段飛ばしてから連続してデータが入力されてしまいます。 恐らく、一行ずつ読み込んでいってる際に変数の加算がおかしくなっているのかと思われますがわからないのです。。。 ![イメージ説明](adc3c852ef9e5a5c5624686b8091eed6.png) 追記(2021/10/20/22:12) 画像を追加いたします。 fbSheet日付部分のスクショ ![イメージ説明](f36ec3a4d89be28e06d91ccd2f459bdb.png) fbSheet時間部分のスクショ ![イメージ説明](5a516ce715c62ab7a20b69d5eef8253c.png) qnoir様修正案のコード **36行目から記載** //----------日付の取得----------// //現在日時のDateオブジェクトを作る var date = new Date(); //現在の「日」を取得し表示形式を整形する var day = date.getDate(); var today = Utilities.formatDate(date, 'JST', 'yyyy/MM/d'); //前日日付にしたいので-1する date.setDate(day - 1); //日付の表示形式を整形する var yesterday = Utilities.formatDate(date, 'JST', 'yyyy/MM/d'); // 追加 fbSheet.getRange('A:A').setNumberFormat('yyyy/MM/dd'); // A列の表示形式を日付形式にする。 fbSheet.getRange('B:B').setNumberFormat('HH:mm'); // B列の表示形式を時刻形式にする。 //----------定義----------// var okData_days = [] //発生日時の格納先 var aValues = fbSheet.getRange('A:A').getValues(); //"障害報告"の"発生日時"部分の値を全て取得 var lastRow = aValues.filter(String).length; //空白の要素を除いた長さを取得 // *******以下 修正案********** // 管理シートのデータを二次元配列で取得 var sourceData = fbSheet.getRange(1, 1, lastRow, 7).getValues(); // 「今日の7:30」を作成 var baseDateTime = new Date(); baseDateTime.setHours(7); baseDateTime.setMinutes(30); baseDateTime.setSeconds(0); baseDateTime.setMilliseconds(0); // 書き込み用の配列 var outputValues = []; // 配列から1行ずつ日時を取得して比較 for (var i = 0, y = 0; i < sourceData.length; i++) { var row = sourceData[i]; // 当日の7:30との差(秒)を計算 var duration = Math.floor(baseDateTime.getTime() / 1000) - **Math.floor(getDateTime(row[0], row[1]).getTime() / 1000);** //エラーコード80行目対象箇所 // 当日の7:30との差が、0秒より大きく24時間以下の場合は、書き込み用の配列に加える if (duration > 0 && duration <= 60 * 60 * 24) { outputValues.push(row); } } // 日誌用シートのB列6行目以降にデータを書き込む fS_Nissi.getRange(6, 2, outputValues.length, 7).setValues(outputValues) } /************************************************ * 日付と時刻のセルから、対応する日時データを返す。 * * 引数: * date : Date : 日付 * time : Date : 時刻 * * 返り値:Date *  :指定されたdate と timeに対応するDateオブジェクト * ***********************************************/ function getDateTime(date, time) { **var hour = time.getHours();** //エラーコード104行目対象箇所 var minute = time.getMinutes(); date.setHours(hour); date.setMinutes(minute); return date; } エラーコード エラー TypeError: time.getHours is not a function getDateTime @ コード.gs:104 myFunction @ コード.gs:80

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/10/18 11:12

「for文を利用して、当日の日付かつ発生時間が07:30未満のものを判定し別シートへ貼り付けるコードを書きましたが、何度やっても貼り付ける行がずれたりしてしまう。」とのことですが、 差し支えなければ、その書いてみたコードも質問文に追記していただけないでしょうか。 (うまく動かないコードでもぜんぜん構いません) さらに、「今はこうなってしまうけれど、本当はどういう動作にしたい」という点も、可能であれば画像をつけて説明していただけると、わかりやすいかなとは思います。
detch

2021/10/18 11:47

qnoir様 当質問をご覧いただきありがとうございます。 自分がやりたいことを再投稿いたしました。 追記・修正依頼あればください。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2021/10/18 13:52

貼り付け先のCシートは、処理前の時点では4行目以降空白であり、条件(「当日の7:30未満、前日の7:30以降」)に合致する行をCシートの4行目以降に、隙間なく貼り付けていきたい、という理解でよろしいでしょうか? (「貼り付ける行がずれたりしてしまう」というのは「隙間なく貼り付けたいのに、現状だと行が飛び飛びになってしまう」、という意味でしょうか)
detch

2021/10/18 14:56

貼り付け先のシートは、このようなひな型になっており6行目(No.1)から連続して判定を通ったデータが入力されるようにしたいです。 setValuesで貼り付ける座標が、日誌用シートのgetRange(5+y,2,1,7).setValue(okData ); で貼り付けれると認識しているのですがループの一週目がなぜか9行目から始まるのです。 日付判定に該当するデータ数を増やすと、10行目から始まったり11行目から始まったりします。(始まりだけが違うだけで、連続して入力はされます) そもそも、ロジックがよくないのかどうなのか。。。 やりたいことは、3000行、7列のシートから前日07:30~当日07:30のデータだけを日誌用シートに貼り付けることです。 私が、考えたロジックは 対象シートをコピー→コピーしたシートを必要な行と列だけに加工して発生日を降順でソート→発生日で上から順番に前日日付かつ07:30以上のデータがあれば、日誌用シートへ貼り付け。(これをループ) そのあと、当日かつ07:30未満のデータがあれば日誌用シートの続きへ貼り付け。(ループ) そのあと、日付が昇順になるようにソート処理でもかけようかと考えています。
退会済みユーザー

退会済みユーザー

2021/10/18 15:24 編集

追加ですみません。 質問文中のプログラムでは時刻の大小をすべて2桁の文字列で比較していますが、質問欄記載の画像では、時間(hour)が1桁のものがあります。 実際のデータでは、時間(hour)は2桁表示(0時~9時は00~09という表示)になっている、という理解でよろしいでしょうか? それとも、実際のデータでは、時間(hour)は1桁になっているものもあるのでしょうか? また、A列・B列の表示形式は、書式なしテキストではなく、日付・時刻型である、という理解でよろしいでしょうか。
detch

2021/10/18 15:57

実際のデータは、時間の表示は09時なら9と表示されています。 A列・B列の表示形式は、A列は日付型、B列は時刻型です。 時刻判定なんですが、時間で判定するやり方がよくわからなかったので。 ”:”で左辺、右辺に分割して、数字を文字列として判定しようと思ったのです。 時間で判定ってできるのでしょうか・・・
退会済みユーザー

退会済みユーザー

2021/10/18 16:25 編集

たとえば、シート上の時刻が1:00の場合、getDisplayValuesは、表示されている文字そのままをとってくるため、 現状のコードだと、"1"と"07"を比較することになります。 しかし、"1"<"07"はfalseとなるので、正しく比較できていません。 もし、現状のコードを生かして、文字列で正しく比較できるようにするのであれば、 障害管理シート(元データ)の時刻列を選択し、 メニューの表示形式→数字→表示形式の詳細設定→その他の日付や時刻の形式 を開き、 「カスタムの日付と時刻の形式」ダイアログで「時(01)」をクリックし、 「先行ゼロ付きの時(01)」を選択し、適用ボタンを押します。 https://teratail-v2.storage.googleapis.com/uploads/contributed_images/037a65576d139526e739a53fb044a07f.png https://teratail-v2.storage.googleapis.com/uploads/contributed_images/664122facca7f155d08e70cb0403f9c1.png https://teratail-v2.storage.googleapis.com/uploads/contributed_images/2e64c2cba7482a7c731159a014a5b757.png これによって時刻が00:00形式になり、正しく比較できるようになります。 文字列で比較しない場合は、時間で判定する、つまり日付時刻型で比較することも可能です(時間の表示形式に関係なく比較できることもあり、可能であれば時間で判定するのがおすすめだと思います)。 ただしこの場合、現状のコードの一部を変える必要が出てきます。
detch

2021/10/18 16:38

元データは諸事情により、変更できないのです。(だから元シートを別のシートへ移して加工する必要があります) ですので、時間で判定できるとおっしゃっていますが。 それは、日付も合わせて判定できるということでしょうか?
detch

2021/10/18 16:58

日付時刻型ということは、日付と時間が別れている(今のシートの状態)と判定できないということですか?
退会済みユーザー

退会済みユーザー

2021/10/19 12:47

日付と時間がわかれていても、その日付と時間を統合して日時オブジェクトにすれば、判定は可能です。 回答の後半に記載の「getDateTime()」というオリジナルの関数が、「指定した日付と時間を統合して日時オブジェクトにする関数」となっています。
guest

回答1

0

ベストアンサー

(1) 書き込み先の先頭行が、6行目以降に固定されず、空白行ができる事象が発生する原因

js

1//----------発生日が"前日"かつ"7:30以降を取得し貼り付け----------// 2for(var i=1,y=1; i<lastRow; i++,y++){ 3}

この部分ですが、for文中のコロンで区切られた部分の3つ目で「y++」としているため、
ループが回るごとにyが+1(インクリメント)されるようになっています。

たとえば、日付降順ソートした後のデータが、下の表のようになっているとします。
そして、実行する当日が、「10月19日」であると仮定します。
(右端の「条件」は、日付時刻の条件に合致するか否かを示すものです)

発生日発生時刻ステータス条件
2021/10/1908:10×
2021/10/1910:10×
2021/10/1907:20
2021/10/1905:10
2021/10/1816:50
2021/10/1810:00
2021/10/1806:00×

上記のように、3行目~6行目が、条件(当日7:30より前、前日7:30以降)に当てはまっています。

しかし、条件に合致するかどうか関係なく、ループが回る都度、yが+1されてしまうため、forループで最初の1行目・2行目をチェックするときもyが+1されてしまいます。
3行目で初めて条件に合うものが現れた時には、すでにyは3になっています。

この結果、最初に合致するデータは 6行目ではなく、3+5=8行目に書き込まれてしまうことになります。

これを回避するには、下記のように、条件に合致したときだけ、+1 (y++) するようにすればよいでしょう。

diff

1-​​ for (var i = 1, y = 1; i < lastRow; i++, y++){ 2+​​ for (var i = 1, y = 1; i < lastRow; i++) { // 最後の「y++」を削除。 3 ​​ var fbHASSEI_Day = fbSheet.getRange(i, 1, 1).getDisplayValue(); 4 ​​ var fbHASSEI_Time = fbSheet.getRange(i, 2, 1).getDisplayValue(); 5 ​​var fbTime = fbHASSEI_Time.split(':'); 6 ​​ // 日付が前日の場合 7 ​​if (yesterday == fbHASSEI_Day) { 8 ​​if (fbTime[0] == "07") { 9 ​​if (fbTime[1] >= "30") { 10 ​​var okData = fbSheet.getRange(i, 1, 1, 7).getDisplayValues(); 11 ​​fS_Nissi.getRange(y + 5, 2, 1, 7).setValues(okData); 12+ ​y++; // 条件に合致する場合のみ yをインクリメント。 13 ​​} 14 ​​} else if 15 ​​(fbTime[0] > "07") { 16 ​​var okData = fbSheet.getRange(i, 1, 1, 7).getDisplayValues(); 17 ​​fS_Nissi.getRange(y + 5, 2, 1, 7).setValues(okData); 18+ y++; // 条件に合致する場合のみ yをインクリメント。 19 ​​} 20 ​​} 21 ​​} 22

(2)日付・時刻の表示形式の処理
コメント欄にあったように、コピーした後の「管理」シートの日付・時刻は、「00:00」形式ではなく「0:00」形式(0時から9時は1桁)になっているとのことですが、
このままだと、元の質問文のプログラムでは正しく時刻の比較ができないため、「00:00」の表示形式に直してやる必要があります。

表示形式を変えるにはsetNumberFormat関数を使用します。

下記は fbSheet のB列を 00:00 形式にする例です。

fbSheet.getRange("B:B").setNumberFormat("HH:mm")

(3)日付が今日の場合の処理

日付が今日の場合、
・時間が07であるならば、分が30未満であれば条件に合致。
・時間が07より小さければ、分に関係なく条件に合致。
となるため、これをコード化すればよいことになります。

下記の「// 日付が今日の場合」以降の部分です。

js

1 fbSheet.getRange("B:B").setNumberFormat("HH:mm"); 2 3 for (var i = 1, y = 1; i < lastRow; i++) { 4 var fbHASSEI_Day = fbSheet.getRange(i, 1, 1).getDisplayValue(); 5 var fbHASSEI_Time = fbSheet.getRange(i, 2, 1).getDisplayValue(); 6 var fbTime = fbHASSEI_Time.split(':'); 7 // 日付が前日の場合 8 if (yesterday == fbHASSEI_Day) { 9 if (fbTime[0] == "07") { 10 if (fbTime[1] >= "30") { 11 var okData = fbSheet.getRange(i, 1, 1, 7).getDisplayValues(); 12 fS_Nissi.getRange(y + 5, 2, 1, 7).setValues(okData); 13 y++; 14 } 15 } else if 16 (fbTime[0] > "07") { 17 var okData = fbSheet.getRange(i, 1, 1, 7).getDisplayValues(); 18 fS_Nissi.getRange(y + 5, 2, 1, 7).setValues(okData); 19 y++; 20 } 21 } 22 // ************日付が今日の場合************* 23 else if (today == fbHASSEI_Day) { 24 if (fbTime[0] == "07") { 25 if (fbTime[1] < "30") { 26 var okData = fbSheet.getRange(i, 1, 1, 7).getDisplayValues(); 27 fS_Nissi.getRange(y + 5, 2, 1, 7).setValues(okData); 28 y++; 29 } 30 } else if 31 (fbTime[0] < "07") { 32 var okData = fbSheet.getRange(i, 1, 1, 7).getDisplayValues(); 33 fS_Nissi.getRange(y + 5, 2, 1, 7).setValues(okData); 34 y++; 35 } 36 } 37 } 38}

別解

ここまでやれば一応、期待する動作に近いものになるのではないかと思います。
(同じコードが繰り返されている所の整理や、書きこむデータのソートについては割愛します)

ただし、上記のコードだと1行ずつ getDisplayValue() して日時を比較し、合致するものを1行ずつ setValues() で書き込んでいるため、速度が遅いというデメリットがあります。

別解として。下記のように2次元配列でデータを取り込み、日付時刻をそのまま比較して
条件に合うデータを配列として作成し、一気に書き込むやり方もあります。

( // 以下 修正案*** 以降が直した部分になります。それ以前は特に直したり不要な変数を削除したりしていません)

(※mapやfilter/for~of等を用いれば、もっとすっきり書けますが、
ここでは文法の解説は本質ではないと考えるため、あえて冗長な書き方をしている部分があります)

js

1function myFunction() { 2 //******rb=robot管理票******// 3 //******fb=障害一覧*********// 4 //----------robot管理票のシート情報(コピー元)----------// 5 var url = "マスキング"; 6 var robotBook = SpreadsheetApp.openByUrl(url); 7 var robotMgtSheet = robotBook.getSheetByName("管理"); 8 9 //----------障害一覧の情報(ペースト先)----------// 10 var failureBook = SpreadsheetApp.getActiveSpreadsheet(); 11 var fS_Nissi = failureBook.getSheetByName("日誌用"); 12 13 //----------シートのコピペ→名前変更----------// 14 var getRobotMgtSheet = robotBook.getSheets()[1]; 15 getRobotMgtSheet.copyTo(failureBook); 16 17 var fbSheet = failureBook.getSheetByName("管理 のコピー"); 18 fbSheet.setName("障害管理"); 19 20 //----------余分な列、行の削除処理********// 21 fbSheet.deleteColumns(1, 7); 22 fbSheet.deleteColumns(6, 8); 23 fbSheet.deleteColumns(8, 5); 24 fbSheet.deleteRow(1); 25 fbSheet.setFrozenColumns(0); 26 // fbSheet.deleteRows(100,3000); 27 28 //----------ステータス列の移動処理----------// 29 var cl = fbSheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 30 var rng = fbSheet.getRange(cl, 1); 31 fbSheet.moveColumns(rng, 4); 32 33 //----------発生日を降順でSORT----------/ 34 fbSheet.sort(1, false); 35 36 //----------日付の取得----------// 37 //現在日時のDateオブジェクトを作る 38 var date = new Date(); 39 40 //現在の「日」を取得し表示形式を整形する 41 var day = date.getDate(); 42 var today = Utilities.formatDate(date, 'JST', 'yyyy/MM/d'); 43 44 //前日日付にしたいので-1する 45 date.setDate(day - 1); 46 47 //日付の表示形式を整形する 48 var yesterday = Utilities.formatDate(date, 'JST', 'yyyy/MM/d'); 49 50 // 追加 51 fbSheet.getRange('A:A').setNumberFormat('yyyy/MM/dd'); // A列の表示形式を日付形式にする。 52 fbSheet.getRange('B:B').setNumberFormat('H:mm'); // B列の表示形式を時刻形式にする。 53 54 55 //----------定義----------// 56 var okData_days = [] //発生日時の格納先 57 var aValues = fbSheet.getRange('A:A').getValues(); //"障害報告"の"発生日時"部分の値を全て取得 58 var lastRow = aValues.filter(String).length; //空白の要素を除いた長さを取得 59 60 // *******以下 修正案********** 61 // 管理シートのデータを二次元配列で取得 62 var sourceData = fbSheet.getRange(1, 1, lastRow, 7).getValues(); 63 64 // 「今日の7:30」を作成 65 var baseDateTime = new Date(); 66 baseDateTime.setHours(7); 67 baseDateTime.setMinutes(30); 68 baseDateTime.setSeconds(0); 69 baseDateTime.setMilliseconds(0); 70 71 // 書き込み用の配列 72 var outputValues = []; 73 74 // 配列から1行ずつ日時を取得して比較 75 for (var i = 0, y = 0; i < sourceData.length; i++) { 76 var row = sourceData[i]; 77 78 // エラー調査用 79 //Logger.log((i+1)+"行目を処理中"); 80 //Logger.log("1列目の値="+row[0]); 81 //Logger.log("1列目の型="+Object.prototype.toString.call(row[0])); 82 //Logger.log("2列目の値="+row[1]); 83 //Logger.log("2列目の型="+Object.prototype.toString.call(row[1])); 84 85 // A列とB列から日付時刻データを計算。 86 var targetDateTime = getDateTime(row[0], row[1]); 87 if (targetDateTime == null) { 88 Logger.log((i+1) + '行目で日付/時刻の変換に失敗したため、スキップします。\nA列=' + row[0] + '\nB列=' + row[1]); 89 continue; 90 } 91 92 // 当日の7:30との差(秒)を計算 93 var duration = Math.floor(baseDateTime.getTime() / 1000) - 94 Math.floor(targetDateTime.getTime() / 1000); 95 96 // 当日の7:30との差が、0秒より大きく24時間以下の場合は、書き込み用の配列に加える 97 if (duration > 0 && duration <= 60 * 60 * 24) { 98 outputValues.push(row); 99 } 100 } 101 102 // 日誌用シートのB列6行目以降にデータを書き込む 103 if (outputValues.length > 0) { 104 fS_Nissi.getRange(6, 2, outputValues.length, 7).setValues(outputValues); 105 Logger.log(outputValues.length +'件のデータを書き込みました。'); 106 } else { 107 Logger.log('対象データは0件でした。') 108 } 109 Logger.log('処理が完了しました。') 110} 111 112 113/************************************************ 114 * 日付と時刻のセルから、対応する日時データを返す。 115 * 116 * 引数: 117 * date : Date : 日付 118 * time : Date : 時刻 119 * 120 * 返り値: 121 *  :正常に処理できた場合:指定された date と timeに対応するDateオブジェクト 122 *  :日付時刻への変換に失敗した場合:null 123 * ***********************************************/ 124function getDateTime(date, time) { 125 try { 126 var hour = time.getHours(); 127 var minute = time.getMinutes(); 128 date.setHours(hour); 129 date.setMinutes(minute); 130 return date; 131 } catch (err) { 132 Logger.log(err.toString()); 133 return null; 134 } 135}

#補足

・getTime()関数は、過去のある一時点(1970年1月1日午前0時0分0秒)から指定した日時までのミリ秒数を返します。

var duration = Math.floor(baseDateTime.getTime() / 1000) - Math.floor(getDateTime(row[0], row[1]).getTime() / 1000);

の部分は、このgetTime()関数を利用して、基準となる日時(当日の7時30分)と、セルから得た日付・時刻の差を計算しています。

getDateTime(row[0], row[1]) はオリジナルの関数で、日付セル(row[0])と時刻セル(row[1])から、対応する日時を表すDateオブジェクトを返す関数です。



・(追記)日付形式・時刻形式のセルでないと、getHours()やgetMinutes()等の関数がエラーになるようなので、
getValuesの前にあらかじめA列とB列の表示形式を変えます。

diff

1+ // 追加 2+ fbSheet.getRange('A:A').setNumberFormat('yyyy/MM/dd'); // A列の表示形式を日付形式にする。 3+ fbSheet.getRange('B:B').setNumberFormat('H:mm'); // B列の表示形式を時刻形式にする。 4 5 6 //----------定義----------// 7 var okData_days = [] //発生日時の格納先 8 var aValues = fbSheet.getRange('A:A').getValues(); //"障害報告"の"発生日時"部分の値を全て取得 9 var lastRow = aValues.filter(String).length; //空白の要素を除いた長さを取得

投稿2021/10/19 12:46

編集2021/10/21 14:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

detch

2021/10/19 17:33

qnoir様 ループの件納得いきました。 自分でも、思ってた仮説と教えてくださった内容が合っていたのですがそれをどうやって実現するかが自分の調べ不足でした。今の所自分の納得するデータができあがったのでホッとしています。 修正案ですが実行してみるとこのようなエラーが出ます。 エラー TypeError: time.getHours is not a function getDateTime @ コード.gs:98 lolFunction @ コード.gs:74 コード98は var hour = time.getHours(); の部分 コード74はMath.floor(getDateTime(row[0], row[1]).getTime() / 1000);の部分です。 そもそも、元のデータが正しい時間として認識されていないからかな?と思っているのですが。。。 あと、元のシートの時間部分をgetValueしてログに出すと 表示されているもの 1列目が 2021/10/19 2列目が 7:29 ログにでているのが Tue Oct 19 16:00:00 GMT+09:00 2021, Sun Dec 31 00:29:00 GMT+09:00 1899, このような形になっています。 日付は正しいのですが、時間がおかしいと思うのですが・・・。 これの直し方がわからず、表記されているままデータを取得しようとgetDisplayValuesを使っていたのです。 聞いてばっかでもうしわけありません。 よければ、お知恵をお貸しください。
退会済みユーザー

退会済みユーザー

2021/10/20 11:51

fbSheetのA列やB列の一部が「書式なしテキスト」となっていると、getHours()関数を実行したときに該当のエラーが発生するようです。 回答欄のコードに、あらかじめ、A列とB列を適切な表示形式に変える処理を追加しました。
detch

2021/10/20 13:11

qnoir様 やはり修正案のコードを稼働させると エラー TypeError: time.getHours is not a function getDateTime @ コード.gs:104 myFunction @ コード.gs:80 とでます。 追加していただいた、 fbSheet.getRange('A:A').setNumberFormat('yyyy/MM/dd'); // A列の表示形式を日付形式にする。 fbSheet.getRange('B:B').setNumberFormat('H:mm'); // B列の表示形式を時刻形式にする。 を追記してみましたが、getValueで取得した値は Tue Oct 20 16:00:00 GMT+09:00 2021, Sun Dec 31 00:29:00 GMT+09:00 1899, のように時間がおかしいです。 fbSheetの日付と時間の入力値を画像として追加しました。
退会済みユーザー

退会済みユーザー

2021/10/20 13:54 編集

時間がおかしく見えるのは、スプレッドシートのタイムゾーン設定が日本時間になっていないからだと思われます。 スプレッドシートのメニューの「ファイル」→「Googleスプレッドシートの設定」から、タイムゾーンを「GMT(+9:00) Tokyo」に設定してください。(念のため、コピー元・コピー先のスプレッドシートのタイムゾーンどちらも同じ日本時間設定にしてください) また、エディタの「設定」(左端のメニューの歯車のマーク)から「「appsscript.json」マニフェスト ファイルをエディタで表示する」にチェックを入れて、 appsscript.jsonの「 "timeZone": "Etc/GMT-9",」の「Etc/GMT-9」を「Asia/Tokyo」に変えてください。 (「Google Apps Scriptで日付のタイムゾーンを日本に直す方法」で検索すれば具体的なやり方が出てくると思います)   しかし、こちらの手元では、画像と同じデータを使っても、time.getHours is not a function というエラーを再現することはできませんでした。 下記を確認してください。 ・ fbSheet.getRange('A:A').setNumberFormat('yyyy/MM/dd'); // A列の表示形式を日付形式にする。 fbSheet.getRange('B:B').setNumberFormat('H:mm'); // B列の表示形式を時刻形式にする。 の2行は、 var sourceData = fbSheet.getRange(1, 1, lastRow, 7).getValues(); よりも前の部分に書いてあるでしょうか。 ・「TypeError: time.getHours is not a function」のエラーが出るのは、何行目を処理しているときでしょうか? 一行目の「2021/10/20 7:29」を処理したときに発生するのでしょうか? ・ fbSheet.getRange('B:B').setNumberFormat('H:mm'); を fbSheet.getRange('B:B').setNumberFormat('HH:mm'); に変えて試してみる。 (HをHHにする)
detch

2021/10/21 12:25

qnoir様 タイムゾーンの変更して実行しましたが、やはりエラーが出てしまいます。 ソースコードをそのまま張りましたので、一緒に見ていただければと思います。 HをHHにするってのも行いましたが、エラーが出てしまいます。
退会済みユーザー

退会済みユーザー

2021/10/21 13:04 編集

// 配列から1行ずつ日時を取得して比較 for (var i = 0, y = 0; i < sourceData.length; i++) { var row = sourceData[i]; の下に5行、Logger.logのコードを追加しました。 この追加後のコードを1回実行したときに出力されるログを、(省略せず全部)記載してください。 もk敵は、エラーとなっているデータと、その型の把握です。
detch

2021/10/21 13:29

表示制限の為分けて記載します。
detch

2021/10/21 13:29

22:17:19 お知らせ 実行開始 22:17:39 情報 1行目を処理中 22:17:39 情報 1列目の値=Wed Oct 20 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 07:29:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 2行目を処理中 22:17:39 情報 1列目の値=Wed Oct 20 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 07:31:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 3行目を処理中 22:17:39 情報 1列目の値=Tue Oct 19 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 22:15:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 4行目を処理中 22:17:39 情報 1列目の値=Tue Oct 19 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 07:35:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 5行目を処理中 22:17:39 情報 1列目の値=Mon Oct 18 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:14:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 6行目を処理中 22:17:39 情報 1列目の値=Mon Oct 18 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:55:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 7行目を処理中 22:17:39 情報 1列目の値=Sat Oct 16 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 11:01:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 8行目を処理中 22:17:39 情報 1列目の値=Thu Oct 14 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 05:30:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 9行目を処理中 22:17:39 情報 1列目の値=Thu Oct 14 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 04:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 10行目を処理中 22:17:39 情報 1列目の値=Fri Oct 08 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 12:22:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 11行目を処理中 22:17:39 情報 1列目の値=Fri Oct 08 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 13:44:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 12行目を処理中 22:17:39 情報 1列目の値=Fri Oct 08 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 18:17:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 13行目を処理中 22:17:39 情報 1列目の値=Fri Oct 08 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 18:40:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 14行目を処理中 22:17:39 情報 1列目の値=Thu Oct 07 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:12:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 15行目を処理中 22:17:39 情報 1列目の値=Thu Oct 07 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 11:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 16行目を処理中 22:17:39 情報 1列目の値=Thu Oct 07 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 12:01:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date]
detch

2021/10/21 13:29

22:17:39 情報 17行目を処理中 22:17:39 情報 1列目の値=Wed Oct 06 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 12:47:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 18行目を処理中 22:17:39 情報 1列目の値=Tue Oct 05 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 10:01:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 19行目を処理中 22:17:39 情報 1列目の値=Tue Oct 05 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 15:09:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 20行目を処理中 22:17:39 情報 1列目の値=Tue Oct 05 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 15:09:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 21行目を処理中 22:17:39 情報 1列目の値=Tue Oct 05 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 21:15:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 22行目を処理中 22:17:39 情報 1列目の値=Mon Oct 04 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:35:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 23行目を処理中 22:17:39 情報 1列目の値=Mon Oct 04 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 17:29:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 24行目を処理中 22:17:39 情報 1列目の値=Sun Oct 03 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 00:19:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 25行目を処理中 22:17:39 情報 1列目の値=Sun Oct 03 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 13:02:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 26行目を処理中 22:17:39 情報 1列目の値=Sun Oct 03 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 14:11:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 27行目を処理中 22:17:39 情報 1列目の値=Sat Oct 02 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 13:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 28行目を処理中 22:17:39 情報 1列目の値=Sat Oct 02 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 21:15:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 29行目を処理中 22:17:39 情報 1列目の値=Fri Oct 01 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 06:33:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 30行目を処理中 22:17:39 情報 1列目の値=Fri Oct 01 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:35:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 31行目を処理中 22:17:39 情報 1列目の値=Fri Oct 01 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 11:30:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 32行目を処理中 22:17:39 情報 1列目の値=Fri Oct 01 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 11:40:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 33行目を処理中 22:17:39 情報 1列目の値=Fri Oct 01 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 15:33:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 34行目を処理中 22:17:39 情報 1列目の値=Thu Sep 30 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 12:04:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 35行目を処理中 22:17:39 情報 1列目の値=Wed Sep 29 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:35:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 36行目を処理中 22:17:39 情報 1列目の値=Wed Sep 29 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 18:01:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 37行目を処理中 22:17:39 情報 1列目の値=Tue Sep 28 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 06:09:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 38行目を処理中 22:17:39 情報 1列目の値=Tue Sep 28 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:35:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 39行目を処理中 22:17:39 情報 1列目の値=Tue Sep 28 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 14:06:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 40行目を処理中 22:17:39 情報 1列目の値=Tue Sep 28 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 21:15:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 41行目を処理中 22:17:39 情報 1列目の値=Mon Sep 27 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:35:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 42行目を処理中 22:17:39 情報 1列目の値=Mon Sep 27 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 14:01:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 43行目を処理中 22:17:39 情報 1列目の値=Sat Sep 25 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 21:15:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 44行目を処理中 22:17:39 情報 1列目の値=Thu Sep 23 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 08:05:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 45行目を処理中 22:17:39 情報 1列目の値=Tue Sep 21 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:35:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 46行目を処理中 22:17:39 情報 1列目の値=Tue Sep 21 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 13:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 47行目を処理中 22:17:39 情報 1列目の値=Tue Sep 21 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 21:15:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 48行目を処理中 22:17:39 情報 1列目の値=Mon Sep 20 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 06:31:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 49行目を処理中 22:17:39 情報 1列目の値=Mon Sep 20 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:16:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 50行目を処理中 22:17:39 情報 1列目の値=Sun Sep 19 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 01:06:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 51行目を処理中 22:17:39 情報 1列目の値=Sun Sep 19 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 06:31:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 52行目を処理中 22:17:39 情報 1列目の値=Sun Sep 19 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 07:30:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 53行目を処理中 22:17:39 情報 1列目の値=Sat Sep 18 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 01:06:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 54行目を処理中 22:17:39 情報 1列目の値=Sat Sep 18 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 06:31:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 55行目を処理中 22:17:39 情報 1列目の値=Sat Sep 18 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 20:01:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 56行目を処理中 22:17:39 情報 1列目の値=Sat Sep 18 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 21:15:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date]
detch

2021/10/21 13:30

22:17:39 情報 57行目を処理中 22:17:39 情報 1列目の値=Fri Sep 17 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 03:09:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 58行目を処理中 22:17:39 情報 1列目の値=Fri Sep 17 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 05:22:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 59行目を処理中 22:17:39 情報 1列目の値=Fri Sep 17 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:15:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 60行目を処理中 22:17:39 情報 1列目の値=Fri Sep 17 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:35:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 61行目を処理中 22:17:39 情報 1列目の値=Thu Sep 16 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:01:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 62行目を処理中 22:17:39 情報 1列目の値=Thu Sep 16 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 09:38:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 63行目を処理中 22:17:39 情報 1列目の値=Wed Sep 15 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 08:08:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 64行目を処理中 22:17:39 情報 1列目の値=Wed Sep 15 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 15:06:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 65行目を処理中 22:17:39 情報 1列目の値=Tue Sep 14 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 15:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 66行目を処理中 22:17:39 情報 1列目の値=Tue Sep 14 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 15:55:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 67行目を処理中 22:17:39 情報 1列目の値=Tue Sep 14 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 21:15:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 68行目を処理中 22:17:39 情報 1列目の値=Mon Sep 13 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=Sat Dec 30 1899 11:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 2列目の型=[object Date] 22:17:39 情報 69行目を処理中 22:17:39 情報 1列目の値=Mon Sep 13 2021 00:00:00 GMT+0900 (Japan Standard Time) 22:17:39 情報 1列目の型=[object Date] 22:17:39 情報 2列目の値=14:06 15:26 22:17:39 情報 2列目の型=[object String] 22:17:42 エラー TypeError: time.getHours is not a function getDateTime @ コード.gs:112 myFunction @ コード.gs:88
detch

2021/10/21 13:30

以上です。
退会済みユーザー

退会済みユーザー

2021/10/21 13:41 編集

コピー先のB列69行目は、途中で改行が入っているデータになっているようですね。 (14:06と15:26の間に改行が入っているデータになっています) 表示上正しく見えているとしても、行の高さを変えるか、単純にダブルクリックしてみてみると、それがわかると思います。 コピー元の方は並び替えにより必ずしも69行目ではないかもしれませんが、どこかに同様のデータがあるはずです。 途中に改行がある69行目のようなデータは、setNumberFormat("H:mm")としても正常に時刻型に変換されず、文字列型のままとなってしまっているため、文字列の状態でgetDateTime関数に渡され「time.getHours is not a function」エラーが発生したと考えられます。 対応法: ・プログラムで事前に日付型や時刻型に変換できないデータが存在するか調べ、存在する場合は、「X列Y行目は不正なデータです」等の警告メッセージを出すようにする。 または ・日付型や時刻型に変換できないデータは無視する 等が考えられます。 (コードはあとで)
退会済みユーザー

退会済みユーザー

2021/10/21 14:09 編集

回答欄のコードを修正しました。 ・エラー調査用のlLogger.logコード5行はもう不要なのでコメント化。(削除してよいです) ・エラー調査用のコードの下に、日付時刻に変換できないエラーが生じた場合スキップするコードを追加。 ・あわせて、getDateTime()関数に中に、日付時刻に変換できない場合の例外処理を追加 ・対象データが1件もなかった場合の処理を追加
detch

2021/10/22 02:01

qnoir様 実行してみてきちんと動作しました。 何日も質問に付き合っていただき本当に感謝しております。 もっと、GASについて勉強しようとおもいます! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問