검색
검색
공개 노트 검색
회원가입로그인

구글 스프레드 시트에서 공짜로 LLM 사용하기(심화-결과) 버전 업

B열에 중간에 빈 셀이 있는 해당 셀만 골라서 작업할 수 있도록 수정

// 배치 작업: B열에서 비연속적인 빈 셀(및 A열에 데이터 있는 행)에 대해 수식을 입력합니다.
function processBatchBlank() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();
  if(lastRow < 2) {
    Logger.log("처리할 데이터가 없습니다.");
    deleteTimeBasedTriggers();
    return;
  }
  
  var batchSize = 10;  // 한 번에 처리할 최대 셀 수
  var batchRows = [];  // 이번 배치에서 처리할 행 번호 목록
  
  // 2행부터 마지막 행까지 스캔하여, A열에 데이터가 있고 B열이 비어 있는 행을 찾습니다.
  // 비연속적이어도 상관없이 최대 batchSize 만큼 모읍니다.
  for (var i = 2; i <= lastRow && batchRows.length < batchSize; i++) {
    var cellA = sheet.getRange("A" + i);
    var cellB = sheet.getRange("B" + i);
    var valueA = cellA.getValue();
    // A열에 데이터가 없으면 해당 행은 건너뜁니다.
    if (valueA === "" || valueA === null) {
      continue;
    }
    // B열이 값도 없고 수식도 없는 경우 처리 대상
    if (cellB.getValue() === "" && cellB.getFormula() === "") {
      batchRows.push(i);
    }
  }
  
  if (batchRows.length === 0) {
    Logger.log("더 이상 처리할 빈 셀이 없습니다.");
    deleteTimeBasedTriggers();
    return;
  }
  
  // 이번 배치의 각 행에 대해 수식 입력
  for (var j = 0; j < batchRows.length; j++) {
    var r = batchRows[j];
    var cell = sheet.getRange("B" + r);
    if (cell.getValue() === "" && cell.getFormula() === "") {
      cell.setFormula("=gpt2(A" + r + ",$B$1)");
    }
  }
  
  // 이번 배치에서 처리한 행 목록을 스크립트 프로퍼티에 저장 (processResults에서 사용)
  PropertiesService.getScriptProperties().setProperty("currentBatchRows", batchRows.join(","));
  
  // 30초 후 processResults를 실행하는 트리거 등록 (수식을 결과값으로 변환)
  ScriptApp.newTrigger("processResults")
    .timeBased()
    .after(30000)
    .create();
  
  Logger.log("processBatchBlank 실행: 처리 행: " + batchRows.join(", "));
}

// 30초 후 실행: 이번 배치의 수식을 결과값으로 고정한 후 다음 배치 실행을 예약
function processResults() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var scriptProperties = PropertiesService.getScriptProperties();
  var rowsStr = scriptProperties.getProperty("currentBatchRows");
  if (!rowsStr) {
    Logger.log("처리할 배치 행 정보가 없습니다.");
    return;
  }
  var rows = rowsStr.split(",").map(function(r){ return parseInt(r, 10); });
  
  // 각 처리된 행의 B열 셀을 값으로 고정
  for (var i = 0; i < rows.length; i++) {
    var r = rows[i];
    var cell = sheet.getRange("B" + r);
    cell.setValue(cell.getValue());
  }
  
  // 배치 정보 삭제 후 트리거 삭제
  scriptProperties.deleteProperty("currentBatchRows");
  deleteTriggerByFunction("processResults");
  
  // 1초 후 다음 배치 작업 실행 (빈 셀이 남아있으면 다시 처리)
  ScriptApp.newTrigger("processBatchBlank")
    .timeBased()
    .after(1000)
    .create();
  
  Logger.log("processResults 실행: 처리 행: " + rows.join(", "));
}

// 지정된 함수 이름의 시간 기반 트리거 삭제
function deleteTriggerByFunction(functionName) {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() === functionName &&
        triggers[i].getTriggerSource() === ScriptApp.TriggerSource.CLOCK) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

// 모든 시간 기반(Clock) 트리거 삭제
function deleteTimeBasedTriggers() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getTriggerSource() === ScriptApp.TriggerSource.CLOCK) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}
공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기
조회수 : 31
heart
T
페이지 기반 대답
AI Chat