GAS中級講座 事前課題 その5【課題2-5】5.スプレッドシート・シート・セルの操作

ネタバレ注意

中級受講中の方、事前課題は自分でやってからこのnoteみてね~。


前回のnote



初級講座受講時のnote



【課題2-5】5.スプレッドシート・シート・セルの操作

演習5-03 シート名

アクティブなスプレッドシートのすべてのシートのシート名をログ出力するスクリプトを作ってみましょう。

あ~~う~~~getNameで名前出せばいいのかあ~~と書いてみたら、変なことになった。

// 演習5-03
// アクティブなスプレッドシートのすべてのシートのシート名をログ出力するスクリプトを作ってみましょう。
function lesson5_03() {
 const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
 for (const sheet of sheets) 
   console.log(`${sheet.getSheetName()}`);
 }

画像1

ちなみに、分かりやすいように、コンテナバインドの元のスプレッドシートのシート名はこうなっている。

画像2

うーん、えええと、シート名ゲットするやつ、ちゃんとリファレンスみるか。
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet?hl=en#getsheetname

画像3

うーん、ちゃんと取れてるな。
えーと。ちゃんと考えないと。

あ~~~変な挙動してたのは、同じ名前の function lesson5_03 が同プロジェクトの別ファイルにあったせいでした。

あ~そうか~これを呼び出してて変な動きになってたのか...。
このへん、スコープだとか関数だとか中級でもっとちゃんと理解しないとな。

演習5-04 シート数

アクティブなスプレッドシートのシート数をログ出力するスクリプトを作ってみましょう。
また、スプレッドシートを引数として渡すと、そのシート数を戻り値として返す関数も作ってみましょう。

1.シート数
2.関数バージョン

とゆーことで2個考えることにします。まずシート数。
これまでの内容を踏まえると、lengthで出せそうです。

function lesson5_04_a() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
const sheets = ss.getSheets();
console.log(`「${ss.getName()}」のシート数は ${sheets.length} 枚です。`);
}

出た。

ほかに getNumSheets もありますが、時間もないので省略。

シート数が出せたので、関数もいってみよう。

function lesson5_04_b() {
 const ss = SpreadsheetApp.getActiveSpreadsheet()
 const sheets = ss.getSheets();
 console.log(`「${ss.getName()}」のシート数は ${returnNumSheets(sheets)} 枚です。(length&関数バージョン)`);
}
function returnNumSheets(x) {
 return x.length;
}

このへんは過去の自分のコードみつつ、で仕上げました。自分のnoteやコードに色々メモしておくの大事だな。

演習5-06 セル範囲

行番号row,列番号column,行数numRows,列数numColumnsを引数として与えると、そのセル範囲のアドレスを戻り値として返す関数を作成してみましょう。
function lesson5_06() {
 const row = 1, column = 1, numRows = 3, numColumns = 5;
 console.log(getRange(row, column, numRows, numColumns));
}
function getRange(row, column, numRows, numColumns) {
 const sheet = SpreadsheetApp.getActiveSheet();
 return sheet.getRange(row, column, numRows, numColumns).getA1Notation();
}

このへんは、行と列の位置関係に注意して、あとは書いていけばOkかなあ。

演習5-11

以下のA1からC4のセル範囲をE3を基点とするセル範囲にコピーするスクリプトを作りましょう。また、シート2のA1からC4にコピーするスクリプトを作成してみましょう。

画像4

うーん、昔の自分はどうやっていたのかnoteとコードを見てみる。
https://note.com/0375/n/n92474f65263d?magazine_key=ma549aee8f69b#jGGrL

function lesson5_11_a() {
 const sheet = SpreadsheetApp.getActiveSheet()
 const values = sheet.getDataRange().getValues();
 sheet.getRange(3, 5, values.length, values[0].length).setValues(values);
}

function lesson5_11_b() {
 const ss = SpreadsheetApp.getActiveSpreadsheet();
 const sheet01 = ss.getSheetByName('シート1');
 const sheet02 = ss.getSheetByName('シート2');
 const values = sheet01.getRange('A1:C4').getValues();
 sheet02.getRange(1, 1, values.length, values[0].length).setValues(values);
}

sheet.getDataRange().getValues(); でごっそり値を取って、
sheet.getRange(3, 5, values.length, values[0].length)でコピペ先指定して、
.setValues(values); でセット。

シートを変えてコピーするときには、シートを定義して、コピーって感じだ。

演習5-13

以下の3つの値を引数として受け取り、シートの最終行にデータを追加する関数を作りましょう。
name
age
favorite
function lesson5_13() {
 const name = 'Ian', age = 28, favorite = 'mango';
 addlastRow(name, age, favorite);
}
function addlastRow(n, a, f) {
 const sheet = SpreadsheetApp.getActiveSheet();
 return sheet.appendRow([n, a, f]);
}


演習5-14

以下の配列を引数として受け取り、シートの最終行にデータを追加する関数を作りましょう。 [name, age, favorite]
function lesson5_14() {
 const name = 'Dan', age = 18, favorite = 'soda';
 const person = [name, age, favorite];
 lastRowByArray(person);
}
function lastRowByArray(persondata) {
 const sheet = SpreadsheetApp.getActiveSheet();
 return sheet.appendRow(persondata);
}


演習5-15


以下の構造のオブジェクトを引数として受け取り、シートの最終行にデータを追加する関数を作りましょう。
{
 name: 'Bob',
 age: 25,
 favorite: 'apple'
}


function lesson5_15() {
 const person = {
   name: 'Bob',
   age: 25,
   favorite: 'apple',
 };
 addLastRowByObject(person);//オブジェクトをpersonとして渡す
}
function addLastRowByObject(persondata) {//仮引数としてpersonを受け取る。
 const sheet = SpreadsheetApp.getActiveSheet();
 return sheet.appendRow([persondata.name, persondata.age, persondata.favorite]);//配列にする。ドット記法
}

ううう、時間が...

続く。


【課題2-6】6.スプレッドシートの操作(実践編)

【課題3】全員参加型FizzBuzz問題リレー

いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!