見出し画像

【GAS】Google Apps Script 活用事例 タスク開始時に現在時刻を入力するスクリプトを書いてみた。

タスク管理表のイメージ

タスク管理表

公開用シート

スクリプト全文

/**
 * タスク名が入力されたら現在時刻を入力する
 * ステータスが完了になったら現在時刻を入力する
 * トリガー 編集時
 * 
 */
function setCurrentTime(){
  const sheet       = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('タスク表');
  const activeSheet = SpreadsheetApp.getActiveSheet();
  
  if(sheet.getName() !== activeSheet.getName()){
    console.warn(`対象シートではないため、処理を終了します。`);
    return
  };

  const activeCell = getActiveCell_(sheet);
  const formatDate = (date, format) => {
    return Utilities.formatDate(date, 'JST', format);
  };

  const date        = new Date();
  const currentDate = formatDate(date, 'yyyy/MM/dd HH:mm');
  const array       = currentDate.split(' '); //['2023/01/20', '21:00']
  console.log(array);

  let column = generateHeaderIndex_(sheet);
  column = modifyObject_(column);

  //タスクの開始時刻を転記する
  if(activeCell.column === column.taskName){
    const taskNumber      = activeCell.row -1;
    const taskNumberRange = sheet.getRange(activeCell.row, 1);
    taskNumberRange.setValue(taskNumber);

    const range = sheet.getRange(activeCell.row, column.date, 1, array.length);
    range.setValues([array]);

    console.log(`activeCell.column ${activeCell.column} === column.taskName ${column.taskName}`);
    console.log(`転記範囲:${range.getA1Notation()}`);

    //タスク名に連番を振る
    setCellFormat_(taskNumberRange, { vertical: 'middle', horizontal: 'center'});

    //時間転記列のフォーマットを中央・真ん中に設定する
    setCellFormat_(range.offset(0, 1), { vertical: 'middle', horizontal: 'center'});

    if(range.isBlank() === false){
      console.log(`入力が完了しました。`);
    }
  }
  else if(activeCell.column === column.status && activeCell.value === '完了'){
    const currentTime  = array[1];
    console.log(`現在時刻:${currentTime}`);
    
    const endTimeRange = sheet.getRange(activeCell.row, column.end);
    endTimeRange.setValue(currentTime);
    setCellFormat_(endTimeRange, { vertical: 'middle', horizontal: 'center'});

    if(endTimeRange.isBlank() === false){
      console.log(`入力が完了しました。`);
    }
  }
}



/**
 * 
 * @param  {SpreadsheetApp.Sheet} sheet - シートオブジェクト
 * @return {Object.<number>} object - { a: 0, b: 1, c:2 }
 * 
 */
function generateHeaderIndex_(sheet){
  const values = sheet.getDataRange().getValues();
  const header = values.shift();

  const object = new Map();
  header.map((value, index) => object[value] = index);
  console.log(`generateHeaderIndex_()を実行中`);
  console.log(object);

  return object
}



/**
 * アクティブなセルを取得する
 * 
 * @param  {SpreadsheetApp.Sheet} sheet - シートオブジェクト
 * @return {Object.<number>} activeCellInfo - { a: 0, b: 1, c:2 }
 */
function getActiveCell_(sheet){
  const activeCell     = sheet.getActiveCell();
  const activeCellInfo = {
    row:    activeCell.getRow(),
    column: activeCell.getColumn(),
    value:  activeCell.getValue(),
    range:  activeCell.getA1Notation()
  }

  console.log(`getActiveCell_()を実行中`);
  console.log(activeCellInfo);
  return activeCellInfo
}


/**
* 
* プロパティの値全てに+1をする
* 
* @param  {Object.<number>} original - {a: 0, b: 1, c: 2}
* @return {Object.<number>} object - {a: 1, b: 2, c: 3}
* 
*/
function modifyObject_(original) {
  const object = Object.keys(original).reduce(
    (after, key) => ({...after, [key]: original[key] += 1}),{}
  );

  console.log(`modifyObject_()を実行中`);
  console.log(object);
  return object
}



/**
 * 
 * セルの書式を設定する
 * @param  {SpreadsheetApp.Range}
 * @param  {Object.<string>}
 * 
 */
function setCellFormat_(range, info){
  if(info.vertical && info.horizontal){
    range
    .setVerticalAlignment(info.vertical)
    .setHorizontalAlignment(info.horizontal);
  }
  return
}

こういうのを付け足しても面白いかも

/**
 * アクティブユーザーを取得する
  *
 * @param  {string} email - Googleのログインに使用しているID
 * @return {string} name - 照会した際に一致した名前
 * 
 */
function getUserName_(email){
  console.log(`getUserName_()を実行中`);
  let name;
  switch(email){
    case 'sample@gmail.com':
    name = '野比のび太';
  }
  return name
}

この記事が気に入ったらサポートをしてみませんか?