株式会社スマレジの開発部でスマレジのサーバサイドを作っています

Redmine APIをGASで実行して、ガントチャートを同期する(3)

こんにちは!株式会社スマレジ、開発部のmasaです。

前回告知し忘れてしまったのですが、今月よりこのブログの更新は隔週更新になります。ご承知おきください。 今日も前回の続きで、GASを触っていきます。

プログラムの構成

f:id:masa2019:20200322192812p:plain
前回のロジック分割を図にするとこんな感じ

前回のブログに乗せ忘れていたのですが、最終的にはこんな構成を考えています。 Actionは最終的にはスプレッドシートの拡張メニュー一つ一つに対応し、それぞれの実処理はLogicで行うイメージです。 API連携先を一種のデータベースに見立てて、レスポンスに対応するModelを用意して、Logicに渡すイメージですね。 現在の実装では、Logic内でConnectionを呼んでいますが、今後Modelに移植する予定です。 Validation条件などもModelに記載していきます。

MVCで言うところのViewがないのは、スプレッドシートがViewに相当するからです。 こういう風に論理的に分けると、プロジェクト内でフォルダを切れないのが辛いですね・・・。

シートをコピーする汎用処理を作る

結構探したのですが、スプレッドシートのテンプレートを指定してシートを追加するという命令がGASにはないみたいなので、 テンプレートシートを1つ用意して、それをコピーして使いまわすことにしました。やり方知っている人、いたら教えてください! これは図中のUtil(SpreadSheetUtil)に記載します。(いろんな場所から呼ぶので)

/**
 *v
 * 2020-03-20作成
 */


/**
 * シートをコピー
 * @param {String} newSheetName コピーしたシートの名前 名前がないときは「元のシート名のコピー」に
 * @param {String} targetSheetName コピーするシートの名前 名前がないときは現在選択されているシート名
 * @param {SpreadSheet} spreadSheet 対象スプレッドシート 指定がない場合は現在のスプレッドシート
 * @return {Sheet} コピーしたシート
 */
function copySheet(newSheetName = null, targetSheetName = null, spreadSheet = null) {
  if (!isset(spreadSheet)) {
    spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  }
  if (!isset(targetSheetName) || targetSheetName.length < 1) {
    targetSheetName = SpreadsheetApp.getActiveSheet().getSheetName();
  }
  if (!isset(newSheetName) || newSheetName.length < 1) {
    newSheetName = targetSheetName + "のコピー";
  }
  var sheetTemp = spreadSheet.getSheetByName(targetSheetName);
  var copiedSheet = sheetTemp.copyTo(spreadSheet);
  copiedSheet.setName(newSheetName);
  return copiedSheet;
}

こんな感じです。

次回は親子関係を意識して、ガントチャートにタスクに記載するロジックを作成していきます。