[Google Apps Script] ワークシートからデータを取得し、別のワークシートに出力する

時間指定で定期実行するトリガー機能を利用するには、ワークシートに対してデータを入出力する必要があります。
ワークシートの操作を学びます。

## 仕様

例としてこんな仕様を満たせるように組み立ててみます。
1 行目はタイトル行とします。

– 入力(Words)ワークシートから「名前、数量、単価」を取得。

– 出力(Logs)ワークシートに「名前、数量、単価、合計(数量×単価)」を出力。

参考にするドキュメントはこちらです。

> – [Class Spreadsheet  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet)
> – [Class Sheet  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/spreadsheet/sheet)

概ねこのような機能が求められそうです。

– 指定した名前のワークシートを取得する。
– 入力シート内のデータを取得する。
– (計算する)
– 出力シート内に追記する。

## シートからデータを取得する

「指定した名前のワークシートを取得する」には `getSheetByName()` を利用します。

– [getSheetByName(name)](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getSheetByName(String))

「入力シート内のデータを取得する」には `getSheetValues()` を利用します。
引数に行数とカラム数が必要になりますので `getLastRow()` も利用します。

– [getSheetValues(startRow, startColumn, numRows, numColumns)](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getSheetValues(Integer,Integer,Integer,Integer))
– [getLastRow()](https://developers.google.com/apps-script/reference/spreadsheet/sheet#getLastRow())

“`javascript
function main() {
var spreadsheetId = “YOUR_SPREADSHEET_ID”;
var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
var sheetInput = spreadsheet.getSheetByName(“Words”);
var sheetOutput = spreadsheet.getSheetByName(“Logs”);
// タイトル行数分の 1 を引く。
var dataRows = sheetInput.getLastRow() – 1;
// タイトル行の次 2 行目からスタート。
var values = sheetInput.getSheetValues(2, 1, dataRows, 3);
Logger.log(values);
}
“`

結果として `[[Apple, 3.0, 200.0], [Banana, 1.0, 300.0], [Orange, 2.0, 150.0]]` という配列が得られました。

## (計算する)

特筆することはないので省略します。

“`javascript
function main() {
(略)
var result = calc(values);
Logger.log(result);
}

function calc(values) {
var result = [];
values.forEach(function (_a) {
var name = _a[0], quantity = _a[1], price = _a[2];
var amount = quantity * price;
result.push([name, quantity, price, amount]);
});
return result;
}
“`

`[[Apple, 3.0, 200.0, 600.0], [Banana, 1.0, 300.0, 300.0], [Orange, 2.0, 150.0, 300.0]]` という結果が帰ってきます。

## シートに結果を追記する

`appendRow()` に引数として配列を渡すと行データとして追記します。
当該ワークシートの最終行も自動認識してくれるので便利です。

– [appendRow(rowContents)](https://developers.google.com/apps-script/reference/spreadsheet/sheet#appendRow(Object))

ですので、こんな表現だけで実現できました。

“`javascript
result.forEach(function (rowContents) {
sheetOutput.appendRow(rowContents);
});
“`

## サンプルコード

最終的にはこのようになりました。

“`javascript
function main() {
var spreadsheetId = “YOUR_SPREADSHEET_ID”;
var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
var sheetInput = spreadsheet.getSheetByName(“Words”);
var sheetOutput = spreadsheet.getSheetByName(“Logs”);
var dataRows = sheetInput.getLastRow() – 1;
var values = sheetInput.getSheetValues(2, 1, dataRows, 3);
var result = calc(values);
result.forEach(function (rowContents) {
sheetOutput.appendRow(rowContents);
});
}
function calc(values) {
var result = [];
values.forEach(function (_a) {
var name = _a[0], quantity = _a[1], price = _a[2];
var amount = quantity * price;
result.push([name, quantity, price, amount]);
});
return result;
}
“`

いろいろとできることが広がりそうですね。