[Asana API]スプレッドシートクラス

AsanaAPIでスプレッドシート連携とタスク登録Asana API

どうも。ケニー(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クラス」をお届けします。お楽しみに。

このシリーズの目次

  1. [Asana API]Asana APIを利用する下準備
  2. [Asana API]単体タスクの取得と更新
  3. [Asana API]単体のタスクの絞り込み取得
  4. [Asana API]複数タスクの取得とフィルター掛け
  5. [Asana API]特定のプロジェクトやセクションにタスクを登録
  6. [Asana API]スプレッドシートとAsana準備編
  7. [Asana API]スプレッドシート設計とGASの下準備
  8. [Asana API]スプレッドシートクラス
  9. [Asana API]カスタムAsanaクラス
  10. [Asana API]グローバルとカスタムメニューとmain
タイトルとURLをコピーしました