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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

2回答

985閲覧

配列名をfor文内で変更したい

Moritz

総合スコア8

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2020/03/03 11:39

前提・実現したいこと

GASとスプレッドシートで英単語テストを作成中です

「c」で始まる単語であれば、「Cのシート」に対して処理を行いたいので
for内で3回目のループ(i=2)の時はArrayC、4回目のループ(i=3)の時はArrayDといった感じに配列名をしたいのです

質問させて頂きたいのは以下の通りです
0. そもそも配列名をコード処理中に変更できるのか?
0. 出来る場合の記述方法
0. 出来ない場合どの様な仕様が望ましいのか

出来ないものとして、自分では予めアルファベット分の配列を用意したり、if文を繰り返すことで動作させてますが、無駄な記述に思えます
もしこれが平仮名だったら51回も同じ様な記述をしなくてはならない訳ですし

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

「該当のソースコード」に記述した書き方では上手く変更出来ませんでした

該当のソースコード

Google

1mondai=この上のforで取得した単語 2score=この上のforで取得した点数 3var alphabet = ["A","B"]; 4var alphakosuu = alphabet.filter(String).length; 5Initial=[]; 6initial=mondai.slice(0,1); 7 8for(var j=0; j<alphakosuu; j++){ 9 if(initial.toLowerCase() == alphabet[j].toLowerCase()){ 10 var ini = alphabet[j]; 11 var atama = String("Initial"+ini); 12 atama.push("動かざるなぁ"); 13 14 //動かなかった記述達 15 //String("Initial"+ini).push(mondai,score); 16 //"Initial"+ini.push(mondai,score); 17 //Initial+ini.push([mondai,score]); 18 19 break; 20 } 21} 22 23//暫定措置のコード 24if(initial.toUpperCase() == "A"){InitialA.push([mondai,score,oldscore]);} 25if(initial.toUpperCase() == "B"){InitialB.push([mondai,score,oldscore]);}

試したこと

暫定措置として

  • A~Zの数だけifを繰り返す
  • A~Zの配列を予め作っておく

というやり方でしのいでます

補足情報(FW/ツールのバージョンなど)

頭文字A~Z全ての単語を1つのシートにまとめれば、各単語を各アルファベットの配列に分ける手順は要らないのですが、今回は分けたいです

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

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

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

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

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

papinianus

2020/03/04 13:13

シートがあるなら getSheetNameBy(initial) で対象シートを指定できるうえ、そこからgetvaluesをすれば一時配列は不要です。 普通、さいしょの一文字から配列の名前をどうこう、ということをしないので、質問者さまのやりたいことを全体として示していただくと「出来ない場合どの様な仕様が望ましいのか」が回答できると思います。
Moritz

2020/03/05 03:13

ありがとうございます 教科書サイトを見るとgetSheetやgetvalueの多用は避けるべきというのを散見しますので、今回は シートから全ての値を受け取って配列に格納 配列をいじって値を変更 配列をシートに書き出し という仕様を試しています ちなみに今回の質問は英単語テストのプログラム最後の処理部分なのですが、最初の出題する部分なんかはpapinianusさんの回答して下さったやり方でやっちゃってます
guest

回答2

0

ベストアンサー

そもそも配列名をコード処理中に変更できるのか?
出来る場合の記述方法

コードの実行中にアクセス対象の配列名を変えたいと言うことであれば、eval関数を使用すれば変更が可能です。例えば

GAS

1InitialB.push([mondai,score,oldscore]);

と言うコードは、

GAS

1var s = 'Initial' + 'B' + '.push([mondai,score,oldscore])'; 2eval(s);

と言うように書くと、eval()の引数で渡した文字列sが式として実行されます。

eval() - MDN web docs

しかし、evalは(上記ドキュメントにも記載されていますが)あまり使用を推奨されるものではないので、余程のことではない限り、使用を控えた方が良いと思います。今回の場合は配列名InitialAInitialB...などの配列名(変数名)を変えることを考えるより、'A'や'B'などの単語の頭文字をキーとしたHashMapを利用するほうが使わない文字の配列は用意しなくても良いし、プログラム全体での扱いもスッキリする気がします。

投稿2020/03/03 12:37

dodox86

総合スコア9256

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

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

Moritz

2020/03/05 03:02

ありがとうございます。返答が遅れて申し訳有りません。 HashMapをググったのですが、「連想配列」という事でよいのでしょうか? 連想配列を使ってみたところ、1ステップ先に進めた感じです ですがイマイチ上手く動作しません。 この質問に記載したコードに追記できればよかったのですが、それは出来ないようなので新たに質問しました もしよろしければ、そちらの質問にもご回答頂ければ幸いです https://teratail.com/questions/245210
dodox86

2020/03/05 03:11

技術的に興味が沸いたので本質問に回答させていただきましたが、プログラム全体の設計で考えると、質問へのコメントでいただいたpapinianusさんの意見も大いに参考になると思います。その方法であればそもそも別で連想配列を用意しなくても取り扱えるように思います。(新たな質問を否定している訳ではありません)
guest

0

そもそも配列名をコード処理中に変更できるのか?

できません。

投稿2020/03/03 11:43

y_waiwai

総合スコア88042

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

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

dodox86

2020/03/03 12:09

質問の要求の範囲が微妙ですが、「コード処理中にアクセスする配列名を動的に変えられるのか」と言うことであれば、eval関数でできます。
Moritz

2020/03/05 03:03

ありがとうございます 推奨されない処理との事なので、いざとなったら試してみますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問