🪛

GASで開発する際、だいたい使用する系の処理をまとめたライブラリ「shomin」をつくった

2025/01/01に公開

きっかけ

GASでなにかツールなどを作成するときは、だいたい以下の処理を使用する。

  • スプレッドシート操作
  • slack通知

そこでその処理をまとめた共通ライブラリを作成した。

code&導入方法

GitHubを参照
https://github.com/nag8/shomin

ライブラリ設定方法

  1. Apps Script画面で画面左のライブラリの部分の+を押下
  2. スクリプトIDに以下を入力して検索を押す。ShominというIDが現れるので追加をクリック
1ujXvi5yWiAFvwsMIcCAQ0WjR_hkXAGBDAkfm4wQhlFgppH6Wb2WUnT7D

sheet.jsの使い方

ルール1 シートの情報はjsonで記載する

sheet.gs
const SHEET = {
  member : {
    name : '従業員情報',
    row : {
      // 実際にデータが何行目からあるかを定義しています。共通処理の中でここの情報を取得しています。
      data : 2,
    },
    column : {
      // 何列目になんの情報があるかを定義してます。後ほどクラスに設定するときに使います。
      id : 1,
      name : 2,
      status : 3,
    },
  },
  form : {
    name : 'フォーム',
    row : {
      data : 2,
    },
    column : {
      time : 1,
      id : 2,
      text : 3,
    },
  },
};

ルール2 シートの情報をとるときはライブラリの処理を作成する

例.gs
function getMemberList(){
  // ここでクラスに入れておくと楽
  return getSheetData(SHEET.member).map(row => new Member(row));
}

ライブラリの処理はこんな感じ

sheet.gs

// シートからの情報を取得する処理(見出しを省く)
function getSheetData(sheetConfig, spreadSheetId){
  let data = getSheetDataFull(sheetConfig, spreadSheetId);
  [...Array(sheetConfig.row.data - 1)].forEach(_ => data.shift());
  return data;
}

// シートからの情報を取得する処理(見出しを省かず、シートの情報全体をとる)
function getSheetDataFull(sheetConfig, spreadSheetId){
  const ss = (spreadSheetId !== undefined)
    ? SpreadsheetApp.openById(spreadSheetId)
    : SpreadsheetApp.getActive();

  const sheet = ss.getSheetByName(sheetConfig.name);
  return ss.getSheetByName(sheetConfig.name).getDataRange().getValues();
}

// 1つのセルに対して情報を設定
function setText(sheetConfig, row, column, text){
  setList(sheetConfig, row, column, [[text]]);
}

// 複数のセルに対して情報を設定
function setList(sheetConfig, row, column, list){
  if(!list.length) return;
  const sheet = SpreadsheetApp.getActive().getSheetByName(sheetConfig.name);
  sheet.getRange(row, column, list.length, list[0].length).setValues(list);
}

// シート全体を更新
function refreshSheet(sheetName, list, startColumn, startRow){

  if(!list[0].length) return;
  const sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);

  startRow = startRow ? startRow : 2;
  startColumn = startColumn ? startColumn : 1;
  sheet.getRange(startRow, startColumn, sheet.getLastRow(), list[0].length).clear();
  sheet.getRange(startRow, startColumn, list.length, list[0].length).setValues(list);
}

仕様&ロードマップ

  • sheet関連処理
  • slack関連処理
  • claspによるGitHubとの接続
  • Notion処理?

Discussion