見出し画像

【GAS】Google Apps Script 活用事例 集計結果をざっとドキュメントにまとめるスクリプト

画像はAdobe Expressのテキストから画像を作成するAIを作成しました。(※修正はなし。出力結果のまま使用)


Google Formsのアンケート集計結果を(集計用シートなどなしで)簡単にざっとまとめるスクリプトを書きました。

シートサンプル
実行結果

コード全文

function countNumbers() {
  const sheet  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('参加後アンケート');
  const values = sheet.getDataRange().getDisplayValues();
  const header = values.shift();

  const column = {
    wholeEventSatisfaction: header.indexOf('イベント全体の満足度'),
    panelDiscussion:        header.indexOf('パネルディスカッションの満足度'),
    afterTalkSatisfaction:  header.indexOf('質疑応答の満足度'),
  };

  console.log(header);
  console.log(values);
  console.log(column);

  const keys  = Object.keys(column);
  const items = getItems_(values);
  let string  = '';


  // シートのアンケート結果を集計する
  keys.map(key => {
    const generateArray = (values, columnIndex) => values.map(row => row[columnIndex]);
    const converted     = generateArray(values, column[key]);
    const headerName    = header[column[key]];
    const itemCounts    = countItemsInArray_(converted, items, headerName);

    console.log(converted);
    console.log(`headerName: ${headerName}`);
    console.log(itemCounts);

    string += `${itemCounts}\n\n`;

  });

  console.log(string);

  // ドキュメントに集計結果を転記する
  const url = 'https://docs.google.com/document/d/*******************/edit';
  updateDocument_(url, string);
  
}



/**
 * 2次元配列から重複排除した1次元配列を作成する
 * 
 * @param  {Array.<Array.<string>>} values - 2次元配列
 * @return {Array.<string>}
 * 
 */
function getItems_(values){
  const items = Array.from(new Set(values.flat()));
  console.log(items);
  return items
}



/**
 * 出力結果を転記し、ドキュメントを更新する
 * @param  {string} url - URL
 * 
 */
function updateDocument_(url, string){
  const documentId = url.replace(/.*document\/d\//, '').replace('/edit', '');
  const document   = DocumentApp.openById(documentId);
  console.log(documentId);

  document.getBody().setText(string);
}



/**
 * itemsが1次元配列内の要素数の出現回数を文字列で返す
 * 
 * @param  {Array.<string>} array - 1次元配列
 * @param  {Array.<string>} items - 1次元配列
 * @param  {string} headerName - 項目名
 * @return {string} 
 * 
 * 
 */
function countItemsInArray_(array, items, headerName) {
  const counts = {};

  array.forEach(item => {
    if (items.includes(item)) {
      counts[item] = (counts[item] || 0) + 1;
    }
  });

  console.log(`headerName: ${headerName}`);
  console.log(counts);

  const itemCountsString = Object.keys(counts).map(key => `・ ${key}: ${counts[key]}`).join('\n');
  const output = `${headerName}\n${itemCountsString}`;

  console.log(typeof itemCountsString);
  console.warn(output);

  return output
}

ログの出力結果

ログの出力結果1
ログの出力結果2

console.warnの本来の使い方ではありませんが、見やすいように色を変えています。

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