アドバイスを頂き、質問を3つに分割させていただきました。
###実現したいこと
test2の要素それぞれをtest3の要素と一致するか判定し、test3にその値を入れたい。(test3はシート1のA列)
そのためにtest2の要素数分の変数(配列)を宣言したい。
ex.
test2の要素が2016/05/11,2016/05/14,2016/05/15
のとき、
test3が2016/05/11 エラー,2016/05/14 エラー,2016/05/14 A,2016/05/15 B
test3に入っているすべての要素(日付の含まれるテキスト)全てに対して、test2の要素2016/05/11
2016/05/14
2016/05/15
それぞれが含まれるか判定したい。
そして
2016/05/11
を含むなら、ary_1へ 2016/05/11 エラー
2016/05/14
を含むなら、ary_2へ 2016/05/14 エラー,2016/05/14 A
2016/05/15
を含むなら、ary_3へ 2016/05/15 B
をpushしたい。
さらに、この日付部分は後にシートの名前やメールタイトルにしたいです。
配列の値は改行を加えた本文や、セルの値として使用していきたいです。
###試したこと
1-1,test2の要素数分の配列を宣言
var count2 = test2.length; for(var i=1;i<=count2;i++){ eval('var ary_' + i -1+ '=[];'); } Logger.log(ary_1);
1-2,配列test2の要素それぞれに、test3の要素それぞれが一致するか判定して、1-1で作った配列に入れたい。
var maxRow=Sheet01.getDataRange().getLastRow(); var test3 = Sheet01.getRange(1,1,maxRow,1).getValues(); var count3 = test3.length; for(var i=1;i<=count2;i++){ var date = test2[i]; for(var j=0;j<count3;j++){ var g = test3[j].match(date); if(g != null){ eval('ary_'+ i-1 +'.push(g)'); } } }
1-3,セルに1-11-2で作ったそれぞれのary_1xの値を使用したい
for(var i=1;i<=count2;i++){ eval('var mailtext = ary_' + i-1 + ';'); /*例. var mailtext = ary_1;*/ eval('var count4 = ary_' + i-1 + '.length;'); /*test2の個数だけ日付のシートを左端に作成して要素をA列にセットしたい*/ for(var j=1;j<=count2;j++){ SpreadsheetObject.insertSheet(test2[i]) `Sheet0`2+i-1`+`.getRange(A,A).setValues(ary_`+i); } /*test2の個数だけary_xそれぞれのメールを送信したい*/ for(var q=1;q<=count2;q++){ eval(`GmailApp.sendEmail("~~~~@~~~.com",test[i]+"分",ary_`+q+`);`); } }
###結果
1-1,これでは重複が除けませんでした。
var test = [2017/05/11,2017/05/14,2017/05/14,2017/05/15];
とすれば動きますが、範囲はかわるためシートから取得したいです。
1-2,
eval();を使用した生成ができない。
また、eval()は使用するべきではないとも聞きます。他に方法があるのでしょうか。
1-3,
出来ませんでした。
###参考
http://qiita.com/htano/items/2476c7f616bed531e2f3
###補足
実際使用するtest2やtest3のデータは
シートからgetRange().getValues()でもってきたもので、になります。
###進行状況 教えていただいたどちらも試しています
A,配列を使用する方法
coco_bauerさんにいただいたアドバイスから
var test2 = Sheet03.getRange(2,1,maxRow).getValues(); var c2 = test2.length; var test3 = Sheet03.getRange(2,2,maxRow).getValues(); var c3 = test3.length; var ary = []; for(var i=0;i<c3;i++){ var date = test3[i]; var ary[i] = []; for(var j=0;j<c2;j++){ var res = test2[j].match(date); if(res != null){ ary[i].push(date) } } }
としてみました。
しかし、
matchのところで、「オブジェクト[2017/05/11 21:53:43]A1で関数matchが見つかりません。」となり、
var ary[i] = [];の箇所で配列の中に配列を作ろうとすると「ステートメントの前に;がありません。」
となってしまいます。
(多次元配列 参考:http://hakuhin.jp/js/array.html#ARRAY_04 https://www.ajaxtower.jp/js/array/index5.html)
B,kei344さんに教えていただいたものも理解したいため、調べながら試しています。
var test2 = [ '東京', '神奈川', '千葉' ]; var test3 = [ '東京都千代田区', '東京都世田谷区', '神奈川県川崎市', '千葉県柏市' ];
データが上記のような場合
Logger.log(res)
{神奈川=[神奈川県川崎市], 東京=[東京都千代田区, 東京都世田谷区], 千葉=[千葉県柏市]}
Logger.log(res["東京"])
[東京都千代田区, 東京都世田谷区]
と出来たのですが、実際使用する日付型のデータだと出来ないでいます。
実際日付を扱うため、並びも日付順(もとのまま)であって欲しいです。
###この後以下の処理をしたい
続けて、内容をテキストファイルとして書き出したり、シートを生成したり、メールとして自動送信する際にここで作った値を使用したいのです。
メール、最初の例のデータの場合
<タイトル>
2016/05/14
<本文(1つずつ改行する)>
2016/05/14 エラー
2016/05/14 A
日付型データでの処理がうまくいかないため、現在はまだ、先程の都道府県のデータで試しているのですが、実現出来ていません。データが追加されるたびに送信されてしまったり、送信順が日付順ではなくなってしまうのです。また、後からループなどで扱おうとした際にres["東京"]など、数字で指定できないのです。
そこでメールの自動送信を諦めて、まず日付ごとに振り分けたデータをその日付毎にシートや別ファイルとして書き出すことにとどめようかと考えています。
しかしシートを日数データ分の数十~数百個も作成するわけにも行かず悩んでいます。
今回の質問はこのために考えた工程だったのですが、遠回りしていますでしょうか。
###メッセージ
解決までまだまだ時間がかかりそうです。スコア等皆様ご迷惑おかけします。
回答1件
あなたの回答
tips
プレビュー