第3章 ケーススタディ:月次の売上表を整える ・ MISSION 11
ミッション11:判定の列を一度に書く(setValues)
お題
金額が 100,000 円以上の明細の区分に「大口」と書こう。1行ずつ書かずに、列をまとめて読んで、まとめて書く。
10月の売上 - Google スプレッドシート
10月の売上
ファイル編集表示挿入表示形式データツールヘルプ
A1fx日付
A
B
C
D
E
1
日付
担当
取引先
金額
区分
2
10/1
佐藤
青葉商事
85000
3
10/2
鈴木
東西物産
150000
4
10/6
高橋
北斗工業
42000
5
10/8
佐藤
南星堂
100000
6
10/14
鈴木
青葉商事
230000
7
10/20
高橋
東西物産
67000
8
10/27
佐藤
北斗工業
98000
9
10
練習のため、実行するたびに表は最初の状態に戻ってから動きます(本物のスプレッドシートでは戻りません。スクリプトの変更は Ctrl+Z で戻せることもありますが、まとめては戻せません)。
Apps Script無題のプロジェクトデプロイ ▾
ファイル +
コード.gs
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行ずつ書かずに、列をまとめて読んで、まとめて書く。
A
B
C
D
E
1
日付
担当
取引先
金額
区分
2
10/1
佐藤
青葉商事
85000
3
10/2
鈴木
東西物産
150000
4
10/6
高橋
北斗工業
42000
5
10/8
佐藤
南星堂
100000
6
10/14
鈴木
青葉商事
230000
7
10/20
高橋
東西物産
67000
8
10/27
佐藤
北斗工業
98000
9
10
A
B
C
D
E
1
日付
担当
取引先
金額
区分
2
10/1
佐藤
青葉商事
85000
3
10/2
鈴木
東西物産
150000
大口
4
10/6
高橋
北斗工業
42000
5
10/8
佐藤
南星堂
100000
大口
6
10/14
鈴木
青葉商事
230000
大口
7
10/20
高橋
東西物産
67000
8
10/27
佐藤
北斗工業
98000
9
10
コードの読み方
- 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 とは関係ありません。