アプリ版:「スタンプのみでお礼する」機能のリリースについて

Google Apps Scriptを最近勉強し始めたのですが、以下のコードが分からず、苦戦しています。
どなたか分かる方は教えて頂きたいです。

具体的には、以下のコードが全くイメージが湧かず苦戦しています。
var arr = new Array(r);
var arr2 = new Array(r);
for(var i = 0;i < r;i++){
arr[i] = new Array(c);
arr2[i] = new Array(c);
}

リンク先:http://libro.tuyano.com/index3?id=641001&page=4
=================================
※選択範囲の各セルの背景色とテキスト色を設定する
function myFunction(){
var range = SpreadsheetApp.getActiveRange();
var r = range.getNumRows();
var c = range.getNumColumns();
var arr = new Array(r);
var arr2 = new Array(r);
for(var i = 0;i < r;i++){
arr[i] = new Array(c);
arr2[i] = new Array(c);
}
Logger.log(arr);
var total = 0;
for(var i = 0;i < r;i++){
for(var j = 0;j < c;j++){
if ((i + j) % 2 == 0){
arr[i][j] = "#FF0000";
arr2[i][j] = "#FFCCCC";
} else {
arr[i][j] = "#0000FF";
arr2[i][j] = "#CCCCFF";
}
}
}
range.setFontColors(arr);
range.setBackgroundColors(arr2);
}
=================================

A 回答 (3件)

ANo1です。



行と列のインデックスのどちらを先にするかは、作者の選択によりますが、仮に行、列の順で
ary[r][c]
として利用するものとします。

補足でご提示の3行4列の値が入っているとするなら、
1行目:ary[0]=[1, 2, 3, 4]
2行目:ary[1]=[5, 6, 7, 8]
  ・・・・・・・
といった感じになります。

上では、ary[r][c]と書きましたが、(ary[r])[c]のように分解して考えると解りやすいかもしれません。(かえって解りにくくなつてる?)

ご質問文でご提示のスクリプトでは、値を代入せずに、先ず、二次元の配列を必要な行・列数分用意していることになります。
    • good
    • 0
この回答へのお礼

誠にありがとうございます、少し理解出来てきました!
補足の文章で考えると、r =3, c = 4として、
arr = new Array[3];
arr[0] = {1, 2, 3, 4}
arr[1] = {5, 6, 7, 8}
arr[2] = {9, 10, 11, 12}
となるのですね!
(後述のため、このサイトも参考にしました。
http://hakuhin.jp/js/array.html

for文内の
arr[i] = new Array(4);
の部分ですが、
arr[0] = new Array(4);
arr[1] = new Array(4);
arr[2] = new Array(4);
となるということは、イメージでいうと、
{1, 2, 3, 4}が代入されたarr[0]が4つの列から出来ていることを指し示しているという認識で大丈夫でしょうか。

※度々すみません、回答がない場合でもベストアンサーに選ばさせて頂きます。

お礼日時:2017/03/21 16:44

ANo2です。



え~~っと・・・

javascriptの配列リテラル表記は角括弧(ブラケット)[ ]を用います。
波括弧{ }は、一般のオブジェクトのリテラル表記で、key:value形式の記述になります。
(配列は、整数インデックスをkeyとしたオブジェクトだとも言えますが…)
https://developer.mozilla.org/ja/docs/Web/JavaSc …

>{1, 2, 3, 4}が代入されたarr[0]が4つの列から出来ていることを
>指し示しているという認識で大丈夫でしょうか。
配列の値が存在する方が区別や理解がしやすいと思い、ANo2では値を用いて説明しましたが、実際のスクリプトは宣言しているだけなので、値は代入されていません。


宣言した範囲外のインデックスを与えるとエラーとなる言語が多いと思いますが、javascriptは柔軟で(柔軟すぎる?)、そのまま範囲を拡張してくれます。
その意味においては、
 var arr = new Array(4);

 var arr = new Array(); や
 var arr = [];
とほとんど等価とも言えます。
(それぞれの宣言後にlength属性を見ると、違いがわかりますが…)


いろいろと簡単に試せると思いますので、ご自身で疑問点を試してみることで、理解が深まるものと思います。
例えば、
var a = new Array(3);
console.log(a); //[undefined, undefined, undefined]

a[0] = 0;
a[3] = 3;
a[5] = 5;
console.log(a); //[0, undefined, undefined, 3, undefined, 5]


あるいは、
var b = [];
b[0] = new Array(4);
b[1] = [];

console.log(b); //[Array[4], Array[0]]
console.log(b[1][10]); //undefined
console.log(b[2]); //undefined
console.log(b[2][0]); //→TypeError

※ 上記の最後の参照はエラーになります。
    • good
    • 0

こんにちは



行数(r)と列数(c)分の二次元配列を設定しています。
https://developer.mozilla.org/ja/docs/Web/JavaSc …

JavaScriptにはもともと単純な配列しかありませんので、配列の各要素を配列とすることで、多次元の配列として利用しています。
例えば、2行×2列の配列なら、
ary = [
 [1行1列, 1行2列],
 [2行1列, 2行2列]
]
のような構造になっています。
    • good
    • 0
この回答へのお礼

分かり易い説明、ありがとうございます。
二次元配列の部分で苦戦しているので、参考URLも拝見させて頂きました。
追加でご質問させて頂いても宜しいでしょうか。

仮に、以下の配列を選択していた場合、
1 2 3 4
5 6 7 8
9 10 11 12

r = 3、c = 4となり、arr = new Array(3)となるかと思います。
このarrは上記例では、{1, 2, 3, 4}を指し、

その後、for文でarr[1] = new Array(4)では、
このarr[1]は上記例の{1, 5, 9}を指すという認識で良いのでしょうか。

その結果、選択した範囲の全ての二次元配列の文言が取得出来るという考えで合っていますでしょうか。

何度もすみませんが、宜しくお願いします。

お礼日時:2017/03/20 15:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!