Redmine APIをGASで実行して、ガントチャートを同期する(3)
こんにちは!株式会社スマレジ、開発部のmasaです。
前回告知し忘れてしまったのですが、今月よりこのブログの更新は隔週更新になります。ご承知おきください。 今日も前回の続きで、GASを触っていきます。
プログラムの構成
前回のブログに乗せ忘れていたのですが、最終的にはこんな構成を考えています。 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; }
こんな感じです。
次回は親子関係を意識して、ガントチャートにタスクに記載するロジックを作成していきます。