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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1664閲覧

日付で構成された配列内の検索

mabochan

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/10/04 04:20

編集2018/10/04 14:16

前提・実現したいこと

GASで当番表を作成しています。
都合の悪い日をメンバーが入力しておいて、作成者が都合のいい人からピックアップするというものを作りたいのです。
個人の予定入力画面(input)から全メンバーの一覧表(memberData)にスクリプトを使って書き込みたいと思っています。
スプレッドシートのmemberDataに本日を中央にした6ヶ月の日付が並んでいて、inputのとある日付がmenberData縦並びカレンダーの何行目にあるのか、スクリプト上で検索したいです。

発生している問題・エラーメッセージ

スプレッドシートから

function searchRow(){ var SS=SpreadsheetApp.openById('10a2ekxJNJxTDylX6abbhsjDZBQNbXxFHKL8IG9XiteM'); var sheet=SS.getSheetByName('memberData'); var input=SS.getSheetByName('input'); var dateList=sheet.getSheetValues(1, 1, sheet.getMaxRows(), 1); var p =input.getRange(7, 4).getValue();  var q =dateList.indexOf(p); Logger.log(p);   コード

コード

で日付配列を取り出して でやっているのですが、-1.0が返されます。 日付が複雑すぎるからでしょうか? ご教示していただけますと幸いです。

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

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

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

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

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

mather

2018/10/04 05:12

GASのソースコードを可能な範囲で貼り付けてください。
guest

回答1

0

ベストアンサー

データ型が違うからだと思います。
Loggerで確認した値は、あくまで表示用にそう見えているだけで、実際はdatetime型です。
一方pはおそらく文字列型。
pをnew Date()の形でつくらないと等しくなりません

投稿2018/10/04 04:29

papinianus

総合スコア12705

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

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

papinianus

2018/10/04 04:32 編集

提示例のpだと多分new Date(2018,7,27,16,0,0)かな。 8月26日の午後4時?
mabochan

2018/10/04 04:54

アドバイスありがとうございます。初心者で申し訳ございません。 pはsheetの日付から取ってきたものです。 var date= new Date(p); //これでいいのかも分かりません。 var index=dateList.indexOf(date); でもindexは-1.0が返されます。時刻が違うのがたまに混ざっているのが気になります。
mabochan

2018/10/04 04:57 編集

スプレッドシートでyyy/mm/ddの日付は時刻はどの様に扱われるんでしょうか?18:00のやつが混ざっております。夜中に1日づつ新しい日を追加しているのですが、そのズレのせいでしょうか?
papinianus

2018/10/04 05:09 編集

コードで語ってほしいですが、言葉でどれくらいできるかやってみます。 ** まず、pもgetValueした値ということですね? であれば`new Date()`の件は忘れてください。 ** 正確におねがいしたいのですが、pを取るときは、getValuesですか?getValueですか?最後のsの有無が重要なのでどちらか明確にしてください。 年月日しかないものにどの時刻が入るかは、夜中の追加をどうやってやっているのか(プログラムなのか手なのか)およびそのときのやり方に依存します。 ** 最終的には、日付までで一致を判定できれば、仮にdatalistの中に違う時間があっても良いのですか? **の3点について、コメントまたは質問への追記をお願いします
mabochan

2018/10/04 06:28 編集

ほんとに始めたばかりで分からないことだらけなので、ご迷惑おかけします。 ① pに関して var p= sheet2.getRange(7, 4).getValue(); で取っております。 ②やってみていたのはvalueです。 p= sheet2.getRange(7, 4).getValues();  に変えてやっても、 var index=dateList.indexOf(p); //-1.0でした。-1.0は無かったということでしょうか? 前後2ヶ月の予定入力や、過去スケジュールの閲覧ができる様にしたいので、夜4時に以下のスクリプトで行を削除追加しています。 //1行目を削除 sheet.deleteRow('1'); sheet2.deleteRow('1'); //最終行を追加 sheet.insertRowsAfter(lastRaw-1,'1'); sheet2.insertRowsAfter(lastRaw-1,'1'); //最終日付を取得し、1日たす var p=sheet.getRange(lastRaw-1, 1).getValue(); var date = new Date(p); date.setDate(date.getDate() + 1); //最終行に書き入れる sheet.getRange(lastRaw, 1).setValue(date); sheet2.getRange(lastRaw, 1).setValue(date); ③時刻はやりたいことに関係なく、日付があっていたら問題ないです。 できれば日付配列をyyyy/mm/ddだけの形で取得したいのですが。 お手数おかけ致します。
papinianus

2018/10/04 09:09

1. getValueのほうがいいです。 2. -1はなかったという意味ですが、そもそもdate型だとindexOfでは比べられないと思います。また、dateListは二重配列なので、その点でも今のままではindexOfは使えません またご提示の動作だったらあまり時刻はズレないように思うのですがね。ただ、最初の行は手で書いていたとおもうのでそのときの時刻が維持されているのではないかなーと思います(0時にならないのはそのせい) 3. 後ほど回答を追記しますが、for文でまわしていくのが今のところもっとも分かりやすいと思われます。
mabochan

2018/10/04 14:00

キーワードをヒントにググってやってみました。 とりあえずはi+1が行数という事で取得できたようです。 本当にありがとうございました。 スプレッドシートの中でvlookupで数を取得するとシートがぐちゃぐちゃで。。。 function searchRow(){ var SS=SpreadsheetApp.openById('10a2ekxJNJxTDylX6abbhsjDZBQNbXxFHKL8IG9XiteM'); var sheet=SS.getSheetByName('memberData');  //6か月分のカレンダー var input=SS.getSheetByName('input');      //メンバー入力用カレンダー var dateList=sheet.getSheetValues(1, 1, sheet.getMaxRows(), 1);  //6ヶ月分の日付データ取得 var dateList2=Array.prototype.concat.apply([],dateList);     //日付データを一次元化。プロトタイプってなんですか? var p =input.getRange(7, 4).getValue().toDateString(); //日付形式を揃えて抽出 for (var i=0;i<sheet.getMaxRows();i++){ if(dateList2[i].toDateString()==p){Logger.log(i)};     //日付データを揃えたものと比べていく。 }}
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問