GCP/Apps Script

Apps Script ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ๋‹ค๋ฅธ Apps Script์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ - ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ

whistory 2023. 2. 14. 10:51
๋ฐ˜์‘ํ˜•

๐Ÿ’ก Apps Script ๋ฅผ ์ด์šฉํ•ด ์‹ค์ œ๋กœ ๊ฐœ๋ฐœํ–ˆ๋˜ ๋‚ด์šฉ์„ ์š”์•ฝํ–ˆ๋‹ค.

 

 

 

 

Apps Script ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ๋‹ค๋ฅธ Apps Script์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

๐Ÿ’ก Apps Script ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•จ์— ์žˆ์–ด, ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ธฐ ์œ„ํ•ด์„œ, ๊ณตํ†ต๋ชจ๋“ˆ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ฐฐํฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. https://whiseung.tistory.com/4 Apps Script ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๊ตฌ์กฐ ์„ค๊ณ„ ๐Ÿ’กApps Scri

whiseung.tistory.com

 

 

 

์œ„์—์„œ Apps Script์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ–ˆ๋Š”๋ฐ,

์‚ฌ์šฉ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ข€ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ์ž‘์„ฑํ•ด ๋ณด์•˜๋‹ค.

 

์„œ์šธ ์˜์—…๋ถ€์„œ Google Sheet์™€ ์—ฐ๊ฒฐ ๋œ Apps Script (๊ป๋ฐ๊ธฐ)

Google Sheets ๋ฉ”๋‰ด์—์„œ [ํ™•์žฅํ”„๋กœ๊ทธ๋žจ] - [Apps script] ๋กœ ์ƒ์„ฑ๋œ Apps Script ์ด๋‹ค.

 

์ƒ๋‹จ ๋ณ€์ˆ˜์—์„œ,

"๋‚ด๊ฐ€ ์„œ์šธ์˜์—…๋ถ€์„œ์˜ ๊ตฌ๊ธ€์‹œํŠธ ํŒŒ์ผ์ด๋‹ค." ๋ผ๊ณ  ๊ตฌ๋ถ„์ง€์„์ˆ˜ ์žˆ๋Š”,

sheet url๊ณผ code๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ ,

accountLib ์— ํ•ด๋‹น ์ •๋ณด๋“ค์„ ์ „๋‹ฌํ•ด์ค€๋‹ค.

const this_url      = accountLib.currentSheetUrl();
const this_jisaCode = "1000";

/**
 * Generate Top buttons.
 */
function onOpen() {
  SpreadsheetApp.getUi()
        .createMenu('๐Ÿ“„ ๋ฆฌ์ŠคํŠธ')
        .addItem('๐Ÿ”Ž ์กฐํšŒ', 'getList')
        .addToUi();
}

/**
 * ๋ฐ์ดํ„ฐ ์กฐํšŒ
 */
function getList() {
  accountLib.getList(this_url, this_jisaCode);
}

 

์˜์—… ๊ณตํ†ต Apps script

์ง€์‚ฌ๋ณ„ ์˜์—… Google Sheet ํ…œํ”Œ๋ฆฟ์€ ๋™์ผํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์˜์—…๊ณตํ†ต apps script ํŒŒ์ผ์—์„œ

sheet ์ด๋ฆ„๊ณผ dataset, table์ด๋ฆ„์„ ์„ ์–ธํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด์„œ ๋ฟŒ๋ ค์ค„ ์ •๋ณด๋“ค์„ common apps script์˜

queryAndBinding ๋ผ๋Š” ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.

const listSheetName = "๋ฟŒ๋ ค์ค„ ์‹œํŠธ ์ด๋ฆ„";
const dataTableId   = "๊ฐ€์ ธ์˜ฌ ํ…Œ์ด๋ธ” ์ด๋ฆ„";

/**
 * ์‹คํ–‰๋œ sheet url return
 */
function currentSheetUrl () {
  return common.getSheetUrl();
}

/**
 * ๋ฆฌ์ŠคํŠธ ์กฐํšŒํ•˜๊ธฐ
 * @param {string} sheetUrl  = ํ•ด๋‹น function์„ ํ˜ธ์ถœํ•œ sheet์˜ URL
 * @param {string} jisa_code = ํ•ด๋‹น function์„ ํ˜ธ์ถœํ•œ sheet์˜ ์‚ฌ์—…์žฅ์ฝ”๋“œ
 */
function getA4Data(sheetUrl, jisa_code ) {
    try {
        const sheetName = listSheetName ;
        const datasetId = GLOBAL_DATASET_ID;
        const tableId   = dataTableId;

        const sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName(sheetName);

        // ์กฐํšŒ์กฐ๊ฑด
        const cellId      = "C4";
        const target_year = common.getCellDataBySheet(sheet, cellId);
        if ( !target_year ) { common.alertMissParam(cellId); return; }

        var columnName = 'grn_class, detail_class, unit, landfill_flag';
        var whereState = 'AND year_date = "' + target_year + '"';
        if ( !common.isNull(jisa_code ) ) {
        	whereState += ' AND jisa_code  = "' + jisa_code  + '" ';
        }
        const orderState = ' ORDER BY CAST(unit AS int64) DESC ; ';

        const queryString = 'SELECT ' + columnName + ' FROM `'
                        +  GLOBAL_PROJECT_ID + "." + datasetId + "." + tableId + '` '
                        + ' WHERE status = "Y" ' + whereState + orderState;

        const dataRange = common.queryAndBinding(sheetUrl, sheetName, queryString, 10, 1, "N", null, "N");

        if ( !common.isNull(dataRange) ) {
        	common.setTableBorderBySheet(sheet, dataRange, true);
        }   
    } catch (error) {
        var msg01 = error.message;
        common.alertMessage("โŒ Error", "(getList) Error Message : " + msg01);
        Logger.log(msg01);
    }
}

 

๊ณตํ†ต Apps script

๋ชจ๋“  ์ •๋ณด๋“ค์„ ๋ฐ›์•„์™€ ์ •๋ง ์‹คํ–‰๋งŒ ํ•ด์ฃผ๋Š” ์‹คํ–‰๋ถ€์ด๋‹ค.

/**
 * ๋ฐ์ดํ„ฐ๋ฅผ Bigquery์—์„œ ์กฐํšŒํ•ด์„œ ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ์— ํ‘œ์ถœ
 * @param {string} sheetUrl     = ์ž‘์—…ํ•  sheet URL
 * @param {string} sheetName    = ์ž‘์—…ํ•  sheet name
 * @param {string} queryString  = Query
 * @param {string} startRow     = startRow
 * @param {string} startColumn  = startColumn
 * @param {string} mergeYn      = ์…€๋ณ‘ํ•ฉ์ด ๋˜์–ด์žˆ์œผ๋ฉด(Y) delete Rows, ์…€๋ณ‘ํ•ฉ์ด ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด(N) clear Rows
 * @param {string} mergeArea    = ์…€๋ณ‘ํ•ฉํ•  ์˜์—ญ - ์˜ˆ์‹œ  ์ฒซ๋ฒˆ์งธ, ์„ธ๋ฒˆ์งธ ์…€์„ ๋ณ‘ํ•ฉ ์‹œ  "[1, 3]"
 * @param {string} headerYn     = ํ—ค๋”(์ปฌ๋Ÿผ์ •๋ณด) ๋ณด์—ฌ์ค„์ง€ ์—ฌ๋ถ€
 */
function queryAndBinding(sheetUrl, sheetName, queryString, startRow, startColumn, mergeYn, mergeArea, headerYn) {
    var request = {
      query         : queryString,
      useLegacySql  : false
    };

    var queryResults  = BigQuery.Jobs.query(request, GLOBAL_PROJECT_ID);
    var jobId         = queryResults.jobReference.jobId;

    // Check on status of the Query Job.
    var sleepTimeMs = 10;
    while ( !queryResults.jobComplete ) {
      Utilities.sleep(sleepTimeMs);
      sleepTimeMs *= 2;
      queryResults = BigQuery.Jobs.getQueryResults(GLOBAL_PROJECT_ID, jobId);
    }

    // Get all the rows of results.
    var rows = queryResults.rows;
    while (queryResults.pageToken) {
      queryResults = BigQuery.Jobs.getQueryResults(GLOBAL_PROJECT_ID, jobId, {
        pageToken: queryResults.pageToken
      });
      rows = rows.concat(queryResults.rows);
    }

    var sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName(sheetName);

    if (rows) {
      // Append the headers.
      var headers = queryResults.schema.fields.map(function(field) {
        return field.name;
      });
      if ( !isNull(headerYn) && headerYn == "Y" ) {
        console.log("show headers");
        sheet.appendRow(headers);
      }

      // Append the results.
      var data = new Array(rows.length);
      for (var i=0; i<rows.length; i++) {
        var cols  = rows[i].f;
        data[i]   = new Array(cols.length);
        for (var j=0; j<cols.length; j++) {
          data[i][j] = cols[j].v;
        }
      }

      sheet.getRange(startRow, startColumn, rows.length, headers.length).setValues(data);

      var rangeObj = new Object();
      rangeObj.startRow     = startRow;
      rangeObj.startColumn  = startColumn;
      rangeObj.endRow       = rows.length;
      rangeObj.endColumn    = headers.length;

      if ( !isNull(mergeArea) ) {
        mergeCell(sheetUrl, sheetName, mergeArea);
      }
    } else {
      alertMessage("โš ๏ธ Data Load Failed!", "์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. \\r\\n");
      Logger.log('No rows returned.');
      return null;
    }
    return rangeObj;
}

/**
 * ๋‹จ์ผ cell ๋ฐ์ดํ„ฐ ์ถ”์ถœ
 * @param {obj} sheet     = ์ž‘์—…ํ•  sheet
 * @param {string} cellId = ์ž‘์—…ํ•  cellId
 */
function getCellDataBySheet(sheet, cellId) {
  try {
    const sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName(sheetName);
    const val   = sheet.getRange(cellId).getValue();

    if ( isNull(val == 0 ? "0" : val) ) {
      return false;
    }

    return val;
  } catch (error) {
    const msg01 = error.message;
    alertMessage("โŒ Error", "(getCellData) Error Message : " + msg01);
    Logger.log(msg01);
  }
}

/**
 * Null ์ฒดํฌ
 * @param {obj}  obj  = Null ์ฒดํฌ ๋Œ€์ƒ
 */
function isNull(obj) {
	return (typeof obj != "undefined" && obj != null && obj != "") ? false : true;
}

/**
 * ํ…Œ๋‘๋ฆฌ ์„ค์ • - ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ ์˜์—ญ์˜ border ์„ค์ •
 * @param {obj}     sheet       = ์ž‘์—…ํ•  sheet
 * @param {string}  sheetName   = ์ž‘์—…ํ•  sheet name
 * @param {obj}     dataRange   = ์ž‘์—…ํ•  sheet range
 * @param {boolean} flag        = set border status
 */
function setTableBorderBySheet(sheet, dataRange, flag) {
  try {
    sheet.getRange(dataRange.startRow, dataRange.startColumn, dataRange.endRow, dataRange.endColumn).setBorder(flag, flag, flag, flag, flag, flag);
  } catch (error) {
    const msg01 = error.message;
    alertMessage("โŒ Error", "(setTableBorder) Error Message : " + msg01);
    Logger.log(msg01);
  }
}

/**
 * Alert Message for Google sheet.
 * @param {string} tit = ํƒ€์ดํ‹€
 * @param {string} msg = ๋ฉ”์„ธ์ง€
 */
function alertMessage(tit, msg) {
  const ui = SpreadsheetApp.getUi();
  ui.alert(tit, msg, ui.ButtonSet.OK);
}

/**
 * ๊ฒ€์ƒ‰์กฐ๊ฑด ๋ˆ„๋ฝ
 * @param {string} param = parameter
 */
function alertMissParam(param) {
  const ui = SpreadsheetApp.getUi();
  ui.alert("โ›” Error", param + " ์กฐ๊ฑด์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", ui.ButtonSet.OK);
}
๋ฐ˜์‘ํ˜•