第3章 ケーススタディ:月次の売上表を整える ・ MISSION 11

ミッション11:判定の列を一度に書く(setValues)

📋 ミッション一覧

お題

金額が 100,000 円以上の明細の区分に「大口」と書こう。1行ずつ書かずに、列をまとめて読んで、まとめて書く。

10月の売上 - Google スプレッドシート
10月の売上

練習のため、実行するたびに表は最初の状態に戻ってから動きます(本物のスプレッドシートでは戻りません。スクリプトの変更は Ctrl+Z で戻せることもありますが、まとめては戻せません)。

Apps Script無題のプロジェクトデプロイ ▾
function markLarge() {
const sheet = SpreadsheetApp.getActiveSheet();
const lastRow = sheet.getLastRow();
const amounts = sheet.getRange(2, 4, lastRow - 1, 1).getValues();
const labels = amounts.map((row) => [row[0] >= 100000 ? '大口' : '']);
sheet.getRange(2, 5, , 1).(labels);
}
Ctrl+S: 保存 ・ Ctrl+R: 実行(エディタ) ・ F5: 開き直す

第3章 ・ MISSION 11

判定の列を一度に書く(setValues)

金額が 100,000 円以上の明細の区分に「大口」と書こう。1行ずつ書かずに、列をまとめて読んで、まとめて書く。

いま
ゴール

コードの読み方

sheet.getRange(2, 4, lastRow - 1, 1).getValues();
2 行目・4 列目から、lastRow - 1 行・1 列ぶん(金額の列)をまとめて読む。
amounts.map((row) => [row[0] >= 100000 ? '大口' : '']);
1行ずつ、10万以上なら「大口」、それ以外は空にした配列を作る。条件 ? A : B は if を1行で書く形。
sheet.getRange(2, 5, labels.length, 1).setValues(labels);
E 列に、labels の行数ぶんまとめて書く。

getValues でまとめて読み、map で1行ずつ変換し、setValues でまとめて書く。セルを1つずつ読み書きするより速く、行が数千あっても待たされない。範囲の行数と配列の行数が違うと「The number of rows in the data does not match …」のエラーになる。

GAS の始め方とよく使う書き方は、記事にまとめています。GAS とは? 始め方とよく使う書き方

書いたコードは、このページの中の隔離した場所で動きます。ページの外やほかのサイトには届きません。

※ Google スプレッドシートと Apps Script の挙動を模擬的に表現したものであり、本来の挙動と一部異なる可能性があります。

※ Google スプレッドシートは Google LLC の商標です。当サイトは Google とは関係ありません。