【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
}
この記事が気に入ったらサポートをしてみませんか?