Library/etc

[Google Apps Script] 구글 스프레드시트로 크롤링

Canele 2022. 4. 26. 15:12
728x90
728x90

예전에 내가 원하는 게시물(목록)를 크롤링하는, 구글 스프레드시트를 만듬.

그런데 구글 스프레드시트가 계속 긁어오는 바람에 과거의 게시물이 날아감.

그래서 특정 시간에 트리거를 놓고 긁어온 스프레드시트 파일을 구글 드라이브에 저장했음.

엑셀 파일, csv 파일로 나눠서 저장하던 기능인데 db 풀백업 같은 느낌?

2년 전에 만든 기능인데 별 문제 없이 굴려감

더보기
/*
 * script to export data of the named sheet as an individual csv files
 * sheet downloaded to Google Drive and then downloaded as a CSV file
 * file named according to the name of the sheet
 * original author: Michael Derazon (https://gist.github.com/mderazon/9655893)
*/
function readSheet(){//시트의 정보를 가져옴
  var i=0;
  const maxSheet = 5;//시트의 모든 배열을 가져오게 하고 싶으나 크롤링 전용 시트까지 긁어와서 하드 코딩함
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  //for(var i=0 ; i < maxSheet; i++){ //해당 스프레드 시트의 모든 시트를 for으로 실행
  while(i<maxSheet){
  var sheet = ss.getSheets()[i];//1번째 시트를 설정
  var folderName = sheet.getName();
  //if를 사용 하여 폴더가 있을 경우 folderID를 부여하고 없으면 해당 폴더를 만드는 기능 구현
  // if //해당 시트의 명으로 폴더가 존재하는 경우
  //console.log(Driveapp.getFolderByName(folderName));
    if(getFolderID(folderName) == null ){// 폴더가 존재하지 않을때
      var folderId = DriveApp.createFolder(sheet.getName());//시트 이름으로 폴더 추가
    }
  Logger.log(sheet.getName());//시트 이름을 로그로 출력
  var folderId = getFolderID(folderName);// 저장할 폴더 이름을 지정
  saveAsCSV(sheet,folderId); // csv파일로 저장
  //myFunction2(sheet);
  //saveAsXLSX(ss,sheet,folderId);
  i++; // i를 증가시켜 다음 시트로 이동
  }
}

 

function getFolderID(folderName)//드라이브에 존재하는 폴더 검색
{
  var folders = DriveApp.getFolders();//드라이브 안의 모든 폴더를 get
  while (folders.hasNext()) { //while문으로 폴더 스캔
   var folder = folders.next(); 
   if(folder.getName() == folderName)//폴더명이 검색값이 일치할 경우
   {
    return folder.getId(); //해당 폴더의 ID값을 리턴함
   }
 }
}
function saveAsCSV(sheet,folderId) {
  var folder = DriveApp.getFolderById(folderId);
  // append ".csv" extension to the sheet name
  var date = new Date(); //날짜 부분이 안 이쁘게 나와서 추가함
  date = getFormatDate(date);
  fileName = sheet.getName() + "_" + date + ".csv";
  fileName1 = sheet.getName() + "_" + date + ".xlsx";
  // convert all available sheet data to csv format
  var csvFile = convertRangeToCsvFile_(fileNamesheet); // 
  // create a file in the Docs List with the given name and the csv data
  var file = folder.createFile(fileNamecsvFile);
  var file = folder.createFile(fileName1csvFile);
}
/**
 *  yyyyMMdd 포맷으로 반환
 */
function getFormatDate(date){
    var year = date.getFullYear();              //yyyy
    var month = (1 + date.getMonth());          //M
    month = month >= 10 ? month : '0' + month;  //month 두자리로 저장
    var day = date.getDate();                   //d
    day = day >= 10 ? day : '0' + day;          //day 두자리로 저장
    return  year + '' + month + '' + day;       //'-' 추가하여 yyyy-mm-dd 형태 생성 가능
}
function convertRangeToCsvFile_(csvFileNamesheet) {// 뒤에 
  // get available data range in the spreadsheet
  var activeRange = sheet.getDataRange();
  try {
    var data = activeRange.getValues();
    var csvFile = undefined;
    // loop through the data in the range and build a string with the csv data
    if (data.length > 1) {//data 범위가 있을 경우 
      var csv = "";
      for (var row = 0row < data.lengthrow++) {
        for (var col = 0col < data[row].lengthcol++) {
          if (data[row][col].toString().indexOf(",") != -1) {
            data[row][col] = "\"" + data[row][col] + "\"";//여기
          }
        }
        // join each row's columns
        // add a carriage return to end of each row, except for the last one
        if (row < data.length-1) {
          csv += data[row].join(",") + "\n";//여기
        }
        else {
          csv += data[row];
        }
      }
      csvFile = csv;
    }
    return csvFile;
  }
  catch(err) {
    Logger.log(err);
    Browser.msgBox(err);
  }
}
728x90
728x90