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

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

仕様

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

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

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

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

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

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

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

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

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

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]] という配列が得られました。

(計算する)

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

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

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

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

サンプルコード

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

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;
}

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