前提・実現したいこと
indexOfで検索する文字を、変更したい。例えば
indexOf(3)と書かずに、例えばindexOf(Key_Word)みたいにして
Key_Wordに代入する形で検索する(具体的には翌週が第何週か示す数字を入れる)ことを実現したい
前提
Spreadsheet上のスケジュールを、毎週、メールに自動で送信することができるよう
Google Apps Scriptを用いてしたいと考えています。
Spreadsheetには、下記の項目を入力済みです
年、月、日、予定、4月1日を基準にその日が第何週か(11列目に記入 月曜始まり)
発生している問題・エラーメッセージ
例えば、第3週の月曜日を検索しようとしているとしてください。 indexOf(3)なら動作するのですが、 3の代わりに変数を入れると正しく検索できません。何か良 い方法がないでしょうか var row= arrTrans[SEARCH_COL].indexOf(3); //だと10を返す これが正解 var row1= arrTrans[SEARCH_COL].indexOf(Key_Word); //だと3を返す ログは以下の通りです [18-12-26 01:46:45:536 PST] 2.0 //Logger.log(Key_Word); [18-12-26 01:46:45:537 PST] 3//Logger.log(Key); [18-12-26 01:46:45:537 PST] 10.0//Logger.log(row); [18-12-26 01:46:45:537 PST] 3.0//Logger.log(row1);
該当のソースコード
1var MAIL_ADDRESS = "*****@co.jp"; 2var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート53'); 3var Key_Word=3;//検索値 4var SEARCH_COL=10;//検索する列 5 var Key=String(Key_Word); 6function searchSheet(){ 7 var arrData = mySheet.getDataRange().getValues(); 8 /*indexOfで高速検索 ---ライブラリUnderscore for GASを利用して、行列を入れ替え---*/ 9 var _ = Underscore.load(); 10 var arrTrans = _.zip.apply(_, arrData); 11 var row= arrTrans[SEARCH_COL].indexOf(3); //検索値の出てきた最初の行番号-1を返す 12 var row1= arrTrans[SEARCH_COL].indexOf(Key_Word); //検索値の出てきた最初の行番号-1を返す 13 14 //var row= arrTrans[10].indexOf(3); //検索値の出てきた最初の行番号-1を返す 15 16 Logger.log(Key_Word); 17Logger.log(Key); 18 Logger.log(row); 19 Logger.log(row1); 20 /* 21 Logger.log(Object.prototype.toString.call(Key_Word)); 22 Logger.log(Object.prototype.toString.call(Key)); 23 24 Logger.log(row); 25 Logger.log(row1); 26 27 for(var i = row; i <= row+10; i++) { 28 Logger.log(arrData[i][1]+'/'+arrData[i][2]+arrData[i][3]+arrData[i][11]+'\n' ); 29 } 30 */ 31 32} 33
試したこと
Key_Wordが数字型だったので、文字型に変換しても
""や''で囲んでみたが、上手くいきませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
再現しません。提示いただいたソースコピーで、正常にrowが取得されました。
質問の情報が不十分だったようです。
Key_Wordを何にしても同じrowを得るのです。ご確認いただけませんか。
var row= arrTrans[SEARCH_COL].indexOf(3); //正しく10を返す。テストに使っているカレンダーで第3週は11行目始まりです。
var row1= arrTrans[SEARCH_COL].indexOf(Key_Word); //Key_Wordに何を入れても3を返す
スプレッドシートのデータも提示していただいていいですか?コードを見る限り、変数であろうが生の値であろうが、とれる値に違いが生まれるはずはないのです。
質問文と結構異なるようなので、質問文を適切な形に修正していただけますか?
本当に「該当のソースコード」のみを実行してもrowに10が返ってきませんか?私はまったく同じ状況で、Key_Wordを2にすると3が、3にすると10が返ってきますよ。
私も質問文にあるコードをほぼそのまま(ログ出力の追加したくらい)試しましたが
質問文にあるような状況は確認できず、正常に動作しています。
コードは質問文にあるもので全部ですか?他に省略しているものとかないですか?
まあ、見直しはやっていただくとして、それってこうやらないと求まらないんですかね?https://teratail.com/questions/123633#reply-188348 とかを参照して(gasで使えるmoment.jsのライブラリもあります)計算で求めてはだめなのでしょうか?
papinianusさん→行番号は求まらないんじゃないですか?
皆様、ありがとうございます。
メールアドレスなど省略しておりましたので、再度掲載します。このコードだと、
rowは10、row1は3となります。同じじゃないといけないのですが…。
var MAIL_ADDRESS = "*****@****.co.jp";
var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート53');
var Key_Word=3;//検索値
var SEARCH_COL=10;//検索する列
var Key=String(Key_Word);
function searchSheet(){
var arrData = mySheet.getDataRange().getValues();
/*indexOfで高速検索 ---ライブラリUnderscore for GASを利用して、行列を入れ替え---*/
var _ = Underscore.load();
var arrTrans = _.zip.apply(_, arrData);
var row= arrTrans[SEARCH_COL].indexOf(3); //検索値の出てきた最初の行番号-1を返す
var row1= arrTrans[SEARCH_COL].indexOf(Key_Word); //検索値の出てきた最初の行番号-1を返す
//var row= arrTrans[10].indexOf(3); //検索値の出てきた最初の行番号-1を返す
Logger.log(Key_Word);
Logger.log(Key);
Logger.log(row);
Logger.log(row1);
/*
Logger.log(Object.prototype.toString.call(Key_Word));
Logger.log(Object.prototype.toString.call(Key));
Logger.log(row);
Logger.log(row1);
for(var i = row; i <= row+10; i++) {
Logger.log(arrData[i][1]+'/'+arrData[i][2]+arrData[i][3]+arrData[i][11]+'\n' );
}
*/
}
質問文を編集してください。
それ本文にかいてくださいませんか
あと、これを実行したときのログの内容も記入してください。
質問者様大変失礼します。macaron_xxx様、今これを解決したとして、コメントにある、今回は第3週を検索することにする、ということを実用化しようとしたとき、日付操作が必要になると予期されます。この質問者様がやりたいことにとって行番号を求めることが進むべき道だと考えていないというコメントです。
papinianusさんがおっしゃる通り、それも必要ですが、結局その週のデータを特定するために、通るべき道です。ただし、それはKey_Wordに値を代入するフェーズで終わっているという認識です。まぁ実現の方法は色々あるのですが、今回の方法は必ずしも間違っていないので。
行番号(あるいは行データ)がわからないと、予定が取得できない。
ログをみた限り、Key_Wordが2なんですが…。ほんとうに実行しているスクリプトと提示しているスクリプトは同じですか?
papinianusさんがおっしゃる通り、その日が第何週かという計算をしなくてはいけないと思います。この問題を解決できたら、取り組む予定でした。ご紹介いただいた質問と回答を参考にさせていただきます。
質問の内容、修正しました。
Key_Wordが2.0なのに、文字列化したKeyが3というわけのわからない状況です。
macaron_xxx様と同意見ですが、実行しているものと提示されているものが同一のものと思えません。
それにログの実行時間が現時刻よりもかなり前です。
現在のコードで実行したログを載せていただけますか?
なぜかアメリカ太平洋時間(PST)ですね。
現在のコードで実行したログも数値に違いはありません。
[18-12-26 02:08:22:389 PST] 2.0
[18-12-26 02:08:22:389 PST] 3
[18-12-26 02:08:22:390 PST] 10.0
[18-12-26 02:08:22:390 PST] 3.0
PSTの部分見逃してました。失礼しました。
実行はsearchSheet()で、関数内他に省略しているところとかはないですか?
macaron_xxxさん、dice142さん 実行しているものと同一のコードを提示しております。
やっぱり、Key_Word=3とコードしているのに、ログが2.0というのはおかしいんですね。
dice142さんの「実行はsearchSheet()」で間違いないかとのご指摘で、同じ名前の関数が、別のスクリプトファイル(コピーしたもの)にあることに思い至りました。そのコピーしたスクリプトファイルを削除したところ、正常に動作いたしました。
皆様、本当にありがとうございました。心から感謝申し上げます。
[18-12-26 19:20:30:318 JST] 3.0
[18-12-26 19:20:30:318 JST] 3
[18-12-26 19:20:30:318 JST] 10.0
[18-12-26 19:20:30:319 JST] 10.0
自己解決でいいので解決方法を記述して解決済みにしておいてください。
身近に詳しいものがおらず、皆様には本当に助けていただきました。ありがとうございます。
PSTとなる場合、スプレッドシート(カレンダーがあるほう)のファイルメニューの設定あたりから、タイムゾーンを確認してください。
今更ですし、もう見てないかもしれませんが。
追記されたコード後段がない状態で、"毎週する"という要件とスプレッドシートをみたとき、arrDataをループして、K列が"3"であるものをピックアップすると思いました(暗黙に10日分ループするとは想像できなかったし、週番号をいれているのにそれを見ずに固定回数でループするとは思わなかった)。
いずれにしても、L列を取るためにarrDataのループは不可避であり、その段階でK列(あるいはそれよりもA-C列)を見れば、行番号を一旦得るなどということ、行番号が得られないことに悩むことは全くの遠回りにしか思えませんでした(このとき、今日の週番号となるべき3は今日から計算で求まるため、変数がどうこうという話は無用だと思っていたというのもあります)。
また、固定で10なので回避できていますが、月をまたぐと週はリセットされますし、月またぎの位置が週の開始とあわないも考えると、週番号で動く方式には原理的に無理があると思っておりました。
結果としてグローバル汚染を学べたようなので、安直な提案で混乱させたことについて質問者様含め皆様にお詫びします。
質問者です。おっしゃる通りですね。
年度初めからの週番号はカレンダー作成時のコードに自分でも組み込めそうだから、それを検索すれば、あとは何とかなるだろうと考えて作り始めました。最初は週番号をピックアップするつもりでしたが、調べたやり方(indexOf)だと最初のデータを検索するようなので、固定回数ループが簡単に思えてそんな仕様にしております。でも、papinianusさんのおっしゃる通り、日付の処理をすれば週番号を記入することは不要な処理なんだということが分かりました。moment.jsなども勉強します。ありがとうございます。
回答3件
あなたの回答
tips
プレビュー