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

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

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

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

Q&A

解決済

1回答

5738閲覧

Google Apps Scriptで配列を動的に設定できるか

_af28_

総合スコア18

Google Apps Script

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

0グッド

0クリップ

投稿2018/10/30 15:13

前提・実現したいこと

同じ作業を繰り返し、配列に入れていく作業なのですが、
最後にintersctionで比較したいため、arrayを複数設定しようとしています。

var _ =Underscore.load();
var array_data = _.intersection(array_data1,array_data2,~);

配列内での作業は実装済みとなりますので、
配列を動的に設定できるのかを質問させていただきます。
そもそも出来るのか、evalが適切なのかという点からご教示頂けると幸いです。

試したこと

function myFunction() { //テストのため1をあらかじめ設定 var i=1; makeit(i) //array_data1という配列が戻ってきてほしい array_data1.push(1) //makeit()で止まるのでログには何も表示されません Logger.log(array_data1); } function makeit(i){ eval("var array_data"+ i +" = []"); //array_data1が見つかりませんとエラーが出ます arrya_data1.push(1) return arrya_data1 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

できますよ、typoに気をつけてください

javascript

1function mnyFunction() { 2//テストのため1をあらかじめ設定 3var i=1; 4 5var array_data1 = makeit(i) 6 7//array_data1という配列が戻ってきてほしい 8array_data1.push(1) 9 10//makeit()で止まるのでログには何も表示されません 11Logger.log(array_data1); //[1.0 , 1.0] 12 13} 14 15function makeit(i){ 16 17eval("var array_data"+ i +" = []"); 18 19//array_data1が見つかりませんとエラーが出ます 20array_data1.push(1) 21 22return array_data1 23}

コードとコードから推測したやりたいことからすると、こういうやりかたがいいのではないでしょうかという提案を。
functionによって変数のスコープが決まるので、makeit側でarray_data1とかって名前をつけても無意味。結局は、makeitの呼び出し側・array_data1の利用側で、変数iを使って変数array_data1を指せる必要がある。
→呼び出し側でevalするか、呼び出し側のthisを渡すか、の手当が必要になってくる。
かといって、1個じゃないから悩んでいるはずで、呼び出し側で、evalはできないと想像する

質問コードのmyFunctionでarray_data1と書いているけれど、("array_data"+i).push(some)みたいな使い方はどうやったってできないのだから、質問が解決できても無意味なんじゃないでしょうか。あらかじめコードで変数名を指定できるってことは個数が分かっているということでしょう?動的に増やす意味がない。
そりゃeval("tmp = array_data"+i+"[1]");とかやればできなくはないのでしょうが、全部のコードをevalで進行していくのはつらいのではないでしょうか。コードに色がつかないからtypoにも気付けない。

利用側で変数を使って変数にアクセスできる、というのはobjectで解決できるし、外で任意の個数作らせるということも考えると、やりたいインデクサでアクセスできるobjectをもらったほうがいいのではないだろうか、と考えました。
このパターンなら、下記を後からobjectにarray_data5を足すことを想定したコードに書きかえるのは難しくないと思います。

ただ、こうやってくると、最初から、array_data[i][j]で良くないですか、って話になって、それが最初の追記

javascript

1function trialGiveMeArrays() { 2 const dataSet = giveMeArrays(4); 3 const two = 2; 4 dataSet["array_data"+two].push(3); 5 Logger.log(dataSet); 6 Logger.log(dataSet["array_data"+two]); 7} 8function giveMeArrays(nanko) { 9 const keys = []; 10 for(i = 1; i <= nanko; i++) {keys.push("array_data"+i);} 11 return keys.reduce(function(prev,curr){ prev[curr] = [0];return prev;}, {}); 12}

-- 将来ご覧になる方へ
特定の用途、要件があってやむなくこうしようとしているものと思われます。
配列が増やしたいなら、端的に2次元配列を作ればよいと思うので、一般論としては参考にしないでください。

投稿2018/10/30 23:08

編集2018/10/31 01:49
papinianus

総合スコア12705

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

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

macaron_xxx

2018/10/31 04:16

giveMeArraysの引数が'nyanko'に見えたというのは置いといて giveMeArraysでわざわざkeysを作ってreduceしているのはなぜでしょう? keys ={};で keys["array_data"+i] = [0] としてしまえばよいような気がしますが。
papinianus

2018/11/01 04:41 編集

macaron_xxxさんへ にゃーん(変数どころか関数名も微妙) かなり考えましたが、合理的には説明できそうにありません。そういう発想を持てませんでした。言われて見ればその通り。それどころか速度的にはそのほうが早いと思います。 なので返答にはなっていないですが。私としては多分今後もこういう構成で書くだろうと思います。こうなったのはrangeで1からnまでの配列を作ってmapしてreduceしてと考えたのに、連番配列がgasでうまいこと作れず、という経緯です。 ただ、rangeができていたとしても、mapせずにいきなりreduceでキーを作りながらobject化することは可能だと想到しました。 ですので、結局のところ理由というか主たる要因は、私が数値からキーを作ることと配列をプロパティとしてobjectを作ることとは別々のものと認識したことにあると思います(reduceがなければforを2回書いた可能性もあります)。そしてこう認識する遠因は、私にとってこれら2つを同時に考えるのが複雑すぎるのと同時に、分けて考えることが習慣的であり無根拠に良いと信じていることではないかと思います。ご参考となれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問