どうも。ケニー(tsujikenzo)です。このシリーズでは「[Asana API]スプレッドシート連携でタスク登録をしよう」をお届けしています。
今日は8回目です。
前回のおさらい
前回は、「スプレッドシート設計とGASの下準備」をお届けしました。
いよいよ、スプレッドシートのGAS、しかもいきなりクラスで書いていきます。
今回は、「スプレッドシートクラス」です。
今日のアジェンダ
- dataシートクラス
- postシートクラス
dataシートクラス
おさらいですが、今回のアプリケーションでは、スプレッドシートに2つのシートを持たせました。
まずは、dataシートクラスを書いていきましょう。
dataシートにやってほしいお仕事(責務と言ったりしますが)は、以下のようなものです。
- 全体のレコードを取得する
- 全体からstarが付いているレコードだけを抽出する
- 転記処理が終わったらstarを付ける
- 転記処理が終わったらなにかしらのメッセージを送信する
これらは、クラスにメソッドとして格納します。
最下部には、このクラスをテストする関数を置いています。
/** Dataシートクラス */
class DataSheet {
/** コンストラクタ */
constructor() {
this.sheetName = 'data';
this.SPREADSHEET_ID = 'あなたのスプレッドシートID';
this.sheet = SpreadsheetApp.openById(this.SPREADSHEET_ID).getSheetByName(this.sheetName);
}
/** すべてのRecordsをオブジェクトレコーズで取得するメソッド
* @return{Array} objArray
*/
getDataSheetRecords() {
const [header, ...records] = this.sheet.getDataRange().getValues();
const objectRecords = records.map(record => {
const obj = {};
header.forEach((element, index) => obj[element] = record[index]);
return obj;
});
return objectRecords;
}
/** starのついていないRecordだけを取得するメソッド */
getRecordWithoutStar() {
const records = this.getDataSheetRecords().filter(record => record['star'] !== '★');
return records;
}
/** recordをSTAR済みにしてDataシートを更新するメソッド */
setStarToDataSheetRecord() {
//すべてのrecordsを取得してスターを付けてDataシートに貼り付ける
const objectRecords = this.getDataSheetRecords();
const withoutStarRecords = objectRecords.filter(record => record['star'] !== '★');
withoutStarRecords.map(record => {
record['star'] = '★';
return record;
});
this.setAllRecords_(objectRecords);
return "dataシートに引数を渡しました";
}
/** 受け取ったオブジェクトレコーズをシートに上書きする
* @param{Array} objectRecords
*/
setAllRecords_(objectRecords) {
//2次元配列に戻して貼り付け
const records = objectRecords.map(record => Object.values(record));
this.sheet.getRange(2, 1, records.length, records[0].length).setValues(records);
return 'Dataシートに書き込み完了しました';
}
}
/** TEST関数 */
function testDataSheet() {
//Dataシートのインスタンス化
const d = new DataSheet();
//全てのRecordsをオブジェクトレコーズで取得する
console.log(d.getDataSheetRecords());
//starのついていないRecordだけをobjectRecordsで取得する
console.log(d.getRecordWithoutStar());
// すべてのRecordsにStarをつけて更新する
console.log(d.setStarToDataSheetRecord());
}
スプレッドシートの確認
現在、スプレッドシートは、このような状態です。
テスト関数の実行
関数testDataSheet()を、実行してみましょう。
実行ログには、取得したレコード情報が表示され、”dataシートに引数を渡しました”が表示されます。
dataシートのレコードには、処理済みの★が付いています。
postシートクラス
postシートは、空の状態です。dataシートのstarを削除して待機しましょう。
postシートクラスを、書いていきましょう。
postシートにやってほしいお仕事(責務と言ったりしますが)は、以下のようなものです。
- 全体のレコードを取得する
- dataシートから★が付いていないレコードを受け取って貼り付ける
- ヘッダー行以下をクリアする
- Asanaにタスクを登録するために、データを整形する
- Asanaにタスクを登録する
- Asanaのタスクを更新する
- Asanaの登録・更新処理が終わったらなにかしらのメッセージを送信する
これらは、スプレッドシートの作業と、Asanaに関する作業と、2つのクラスに分けます。
まずは、postシートに関するクラスです。
最下部には、このクラスをテストする関数を置いています。
/** Postシートクラス */
class PostSheet {
/** コンストラクタ */
constructor() {
this.sheetName = 'post';
this.SPREADSHEET_ID = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID');
this.sheet = SpreadsheetApp.openById(this.SPREADSHEET_ID).getSheetByName(this.sheetName);
}
/** すべてのRecordsをオブジェクトレコーズで取得するメソッド
* @return{Array} objArray
*/
getPostSheetRecords() {
const [header, ...records] = this.sheet.getDataRange().getValues();
const objectRecords = records.map(record => {
const obj = {};
header.forEach((element, index) => obj[element] = record[index]);
return obj;
});
return objectRecords;
}
/** starの付いていないレコードを取得し、postシートに貼り付けるメソッド */
setRecordWithoutStar() {
//Dataシートのインスタンス化と、starのついていないレコードを取得
const d = new DataSheet();
const records = d.getRecordWithoutStar();
//2次元配列に戻す
const recordsArray = records.map(record => Object.values(record));
// 2行目から貼り付け
post.sheet.getRange(2, 1, recordsArray.length, recordsArray[0].length).setValues(recordsArray);
//starをつける
d.setStarToDataSheetRecord();
return '★無しレコードをpostシートに貼り付けました';
}
/** Asanaにタスクを登録する */
postTaskToAsana() {
//タスクの取得
const records = this.getPostSheetRecords();
//AsanaAPIのインスタンス化(未実装)
// const a = new CustomAsana();
//タスクを登録する処理(未実装)
// records.map(record => a.createTask(record));
//postシートをクリア
this.sheetClear_();
return 'Asanaにタスクを登録しました';
}
/** シートのクリア */
sheetClear_() {
const lastRow = this.sheet.getLastRow();
const lastColumn = this.sheet.getLastColumn();
const range = this.sheet.getRange(2, 1, lastRow, lastColumn);
range.clear();
return 'シートをクリアしました';
}
}
/** TEST関数 */
function testPostSheet() {
//Dataシートのインスタンス化
const p = new PostSheet();
// starの付いていないレコードを取得し、postシートに貼り付ける
console.log(p.setRecordWithoutStar());
//全てのRecordsをオブジェクトレコーズで取得する
const records = p.getPostSheetRecords();
console.log(p.getPostSheetRecords());
// Asanaにタスクを登録する(未実装)
console.log(p.postTaskToAsana());
}
未処理のタスクが、postシートに転記されました。(このあと、Asanaにタスク登録されて、シートがクリアされる予定です)
dataシートには処理済みの★が付与されています。
まとめ
以上で、「スプレッドシートクラス」をお送りしました。
ちょっと長くなったので、一度切ります。
次回は、「カスタムAsanaクラス」をお届けします。お楽しみに。