GASでプログラミング入門 ～応用編 Vol.2～

社内サークルにてエンジニアから非エンジニアの方向けにプログラミングを教えるという活動を行っています。

今回はその教材応用編の第2弾です。
前回の記事は[こちら](https://qiita.com/YoshinagaYuta/items/3b90449fdc7ecf8c0d5f)

## 前回の演習問題の解答例

(1). スプレッドシートのA1セルに氏名、B1セルに出身、C1セルに趣味、D1セルに一言メッセージを入力しておき、入力したセルをGASのコード内で取得して、下記のような自己紹介を表示するプログラムを作成してください。

```
氏名：鈴木一郎
出身：東京都
趣味：ドライブ
一言：GASを頑張ってマスターする！
```

解答例コード

```js
function myFunction() {
    // 読み込む対象のスプレッドシートを取得する。(現在開いているスプレッドシート)
    const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    // 読み込む対象のスプレッドシート内のシートを取得する。(現在開いているスプレッドシート内のシート)
    const sheet = spreadsheet.getActiveSheet();
    // 指定するセルの範囲（A1～D1）を取得
    const range = sheet.getRange(1, 1, 1, 4);
    // 値を取得
    const values = range.getValues();
    // 値を出力
    console.log("氏名：" + values[0][0]);
    console.log("出身：" + values[0][1]);
    console.log("趣味：" + values[0][2]);
    console.log("一言：" + values[0][3]);
}
```

(2). スプレッドシートのA2セルに10、A3セルに5を入力しておき、入力したセルをGASのコード内で取得して、下記のような出力になるようにプログラムを作成してください。

```
計算結果：2
```

解答例コード

```js
function myFunction() {
    // 読み込む対象のスプレッドシートを取得する。(現在開いているスプレッドシート)
    const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    // 読み込む対象のスプレッドシート内のシートを取得する。(現在開いているスプレッドシート内のシート)
    const sheet = spreadsheet.getActiveSheet();
    // 指定するセルの範囲（A2～A3）を取得
    const range = sheet.getRange(2, 1, 2, 1);
    // 値を取得
    const values = range.getValues();
    // 値を出力
    let num1 = values[0][0];
    let num2 = values[1][0];
    console.log("計算結果：" + (num1 / num2));
}
```

## スプレッドシートのセルに書き込む

前回までの内容で、特定のスプレッドシートの特定のセルの内容を取得するところまでは学習しましたので、今回はセルにGASから値を書き込む手順について紹介していきます。
といっても手順はとても簡単で、前回のセルの内容を読み取る手順とほぼ同じになっています。

### 書き込む対象が単一セルの場合

単一セルに値を書き込む場合の手順は

1. 書き込む対象のセルをgetRange関数で指定する。
1. getRangeで取得したオブジェクトにsetValue関数で値を書き込む。

という手順になります。

```js
// 読み込む対象のスプレッドシートを取得する。(現在開いているスプレッドシート)
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// 読み込む対象のスプレッドシート内のシートを取得する。(現在開いているスプレッドシート内のシート)
const sheet = spreadsheet.getActiveSheet();
// 指定するセルの範囲（A1）を取得
const range = sheet.getRange('A1');
// 値を取得
let value = range.getValue();
console.log(value);
// 値を設定
range.setValue('GASから書き込み１');
// 値を取得
value = range.getValue();
console.log(value);
// 値を設定
range.setValue('GASから書き込み２');
// 値を取得
value = range.getValue();
console.log(value);
```

上記コードを実行するとコンソールには下記が表示されます。
※A1セルが空白の状態で実行した前提となります。

```

GASから書き込み１
GASから書き込み２
```

また、スプレッドシートのA1セルには`GASから書き込み２`が書き込まれています。

```js
// 値を取得
let value = range.getValue();
console.log(value);
```

ここの部分でまずA1セルの値を取得して出力しています。

```js
range.setValue('GASから書き込み１');
value = range.getValue();
console.log(value);
```

続いてsetValue関数でセルに書き込みを行っています。
この時"GASから書き込み１"という文字列をA1セルに書き込み、A1セルの値を再度取得して、出力しています。

### 複数セルに書き込む場合

複数セルに書き込む場合は、setValuesという関数を使い、書き込むデータを2次元配列で用意する必要があります。

```js
// 読み込む対象のスプレッドシートを取得する。(現在開いているスプレッドシート)
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// 読み込む対象のスプレッドシート内のシートを取得する。(現在開いているスプレッドシート内のシート)
const sheet = spreadsheet.getActiveSheet();
// 指定するセルの範囲（A1～C1）を取得
const range = sheet.getRange(1, 1, 1, 3);
// 値を取得
let values = range.getValues();
// 値を出力
for (let i = 0; i < values.length; i++) {
    for (let j = 0; j < values[i].length; j++) {
        console.log(values[i][j]);
    }
}
// 値を設定
const data = [[1,2,3]];
range.setValues(data);
// 値を取得
values = range.getValues();
// 値を出力
for (let i = 0; i < values.length; i++) {
    for (let j = 0; j < values[i].length; j++) {
        console.log(values[i][j]);
    }
}
```

上記を実行するとA1からC1セルに1,2,3の数字が書き込まれます。

```js
// 横方向に書き込こむ値を2次元配列に設定
const data = [[1,2,3]];
range.setValues(data);
```

少々分かりづらいのですが、複数値を設定する場合は、2次元の配列に対して値をセットしてsetValuesの引数に渡す必要があります。
横方向だけであれば、1次元配列でも良さそうな気もしますが、縦横含めて複数の値を書き込むことができるので、2次元配列で用意する必要があると覚えておいてください。
参考までに、上記コードはA1～C1の横方向への書き込む例でしたが、A1～A3の縦方向に書き込む場合の2次元配列は以下のようになります。

```js
// 縦方向に書き込こむ値を2次元配列に設定
const data = [[1],[2],[3]];
range.setValues(data);
```

## 演習問題

(1). for文を使用して下記のようにA1～A5セルに書き込まれるプログラムを記述してください。

```
ループ処理1回目
ループ処理2回目
ループ処理3回目
ループ処理4回目
ループ処理5回目
```

(2). 変数strを作成し、"条件式1"という文字列で初期化し、下記のようにB1セルに書き込まれるプログラムを作成してください。

```
条件式1の処理を実行
```

また、変数strの値を"条件式2"に変更した場合は下記のようになるようにしてください。

```
条件式2の処理を実行
```

## まとめ

いかがでしたでしょうか。
今回は前回に続いてスプレッドシートのセルに値を書き込むことを学習しました。
これでスプレッドシートに対するデータの入出力をGASから行うことができるようになりましたので、業務でGASを活用するイメージがまた具体的になってきたのではないかと思います。
次回以降ではGASからWebサイトにアクセスする方法を紹介する予定です。
それではまた次の記事でお会いしましょう。