見出し画像

【GAS】Google Apps Script 活用事例 1年間に対応した採用面接・カジュアル面談回数をカウントするスクリプト

去年は、22卒の面談回数のカウントするためにカレンダーからの書き出しについてまとめました。今年は、集計結果をフィードバック用のシート原本に差し込み、複製する方法についてまとめてみました。こっちの方が需要がありそうな気がします。

集計結果を原本に差し込むスクリプト全文

/**
* 1. 面接回数集計表から値を取得する。
* 2. 原本を複製して、面接官ごとの集計を差し込むする
*
* getNamesFromSheet 集計表から面接官の名前と面接回数を取得
* duplicateSheet_(info) 原本を複製し、引数として受け取った値を差し込みしていく
*
*/

function getNamesFromSheet() {
 const url    = '*****************';
 const sheet  = getSheetByUrl_(url);
 const values = sheet.getDataRange().getDisplayValues();
 const header = values.shift();

 const column ={
   job:       header.indexOf('担当'),
   name:      header.indexOf('名前'),
   casual:    header.indexOf('面談回数'),
   interview: header.indexOf('面接回数'),
   coffee:    header.indexOf('コーヒー・ご飯'),
   event:     header.indexOf('イベント'),
   note:      header.indexOf('特記事項'),
   flag:      header.indexOf('FB対象外'),

 }

 console.log(values);

 let count = 0;

 for(let i = 0; i < values.length; i++){
   if(!values[i][0] || values[i][column.flag] === '対象外')continue

   const info = {
     job:       values[i][column.job],
     name:      values[i][column.name],
     casual:    values[i][column.casual],
     interview: values[i][column.interview],
     coffee:    values[i][column.coffee],
     event:     values[i][column.event],
     note:      values[i][column.note],
     flag:      values[i][column.flag]
   }

   console.log(info);
   duplicateSheet_(info);

   count +=1;

 }//for
 console.log(`対象者: ${count} 件`);
}//end



/**
* 
* ファイル内に存在する原本を複製し差し込みしていく
*
* @param {object} オブジェクト
* @return 
*
*/
function duplicateSheet_(info){
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const url         = '********************';
 const original    = getSheetByUrl_(url);
 const sheet       = original.copyTo(spreadsheet);

 console.log(`コピー後のシート: ${sheet.getSheetId()}`);
 sheet.setName(`${info.name}さん`);

 const keys = Object.keys(info);
 console.log('keys', keys);
 
 for(const key of keys){
   const query   = `${key.replace(/'/g, '')}`;
   console.log(query);

   const finder  = spreadsheet.createTextFinder(query).useRegularExpression(true);
   const results = finder.findAll();
   const length  = results.length;

   console.log(`検索語句: ${query} , 検索結果: ${length} 件`);

   const range = sheet.getRange(results[0].getRow(), results[0].getColumn());
   console.log(`該当箇所: ${range.getA1Notation()}`);

   range.setValue(info[key]);
 }
}


/**
* スプレッドシートのURLから、シートオブジェクトを取得する
*
* @param  {string} シートのURL
* @return {object} シートオブジェクト
*
*/
function getSheetByUrl_(url) {
 const spreadsheet = SpreadsheetApp.openByUrl(url);
 const sheets      = spreadsheet.getSheets();

 console.log(url.split('#gid='));

 //シートIDを、文字列から数値に変換する
 const sheetId = Number(url.split('#gid=')[1]);

 //前述のsheetIdが、型も含めて完全一致したときに、sheetをオブジェクトとして返す。
 for (const sheet of sheets) {
  if (sheetId === sheet.getSheetId()){
    console.log(sheet.getName());
    return sheet
   };
  }//for
 }//end

シートをコピーする copyToメソッド

今回は、同じファイル内に原本を複製するため、下記のように書いています。

const sheet = original.copyTo(spreadsheet);

特定の範囲の場合は、下記のようにすればOK

const copyToRange = original.copyTo(tagetRange); //コピーしたい範囲
copyToRange.activate(); //コピーした範囲をアクティブにする

サンプルスクリプト_その1

function myFunction() {
 const info = {
   name: 'ベル・クラネル',
   job:  'ヘスティア・ファミリア'
 }

 const keys = Object.keys(info);
 console.log(keys); //[ 'name', 'job' ]

 for(const key of keys){
   const query = `${key.replace(/'/g, '')}`; //シングルクオーテーションを削除する
   console.log(`key: ${query}, value: ${info[query]}`);

 }
}

スクリーンショット 2022-03-18 21.02.13

こんな感じで、key と value が取得できます。
シートから値を取得、差し込む準備が出来ましたッ!!

サンプルスクリプト_その2

function myFunction2(){
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheet       = spreadsheet.getActiveSheet();
 const query       = 'test';

 const finder  = spreadsheet.createTextFinder(query).useRegularExpression(true);
 const results = finder.findAll();
 const length  = results.length;

 console.log(`検索語句: ${query} , 検索結果: ${length} 件`);

 const range = sheet.getRange(results[0].getRow(), results[0].getColumn());
 console.log(`該当箇所: ${range.getA1Notation()}`);
} 

スクリーンショット 2022-03-18 20.59.45

今回は、面接官は集計表に重複せずに、存在する想定でスクリプトを書いています。

後から大量の修正依頼?......えっ.....やめてよ(小声)

複製した後で、35枚ものシートの特定箇所のみ修正して欲しいとの依頼がありました。35枚ってエグいな.....。その時に使用したスクリプトがこちらです。

function getSheets(){
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheets      = spreadsheet.getSheets();

 let count = 0;

 for(const sheet of sheets){
   const sheetName = sheet.getName();
   
   //シート名に面接官の名前 + さん
   // (例) 野比のび太さん のように、シート名にさんが付くのだけを対象とする。
   if(sheetName.includes('さん')){
     console.log(sheetName)
     count += 1;

     const targetValue = sheet.getRange('A2').getValue();
     console.log(`A2: ${targetValue}`);

     if(targetValue === '2021'){
       sheet.getRange('A2').setValue('2022');
       console.log('書き換え完了');
     }
   }
 }
 console.log(`該当:${count} 件`);
}

去年のシートをコピペして今年のものを作成した際、日付が去年のままだったとか....そういうときに使えるかなと思っています。

目次を作成するのに便利なスクリプトはこちら

ドキュメントへの差し込みはこちら


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