>source

문제 :

가져 오기 기능 importXLSXtoGsheet()  모든 52 XLSX 파일을 처리하기 전에 시간이 초과되면 오류가 발생했습니다. Exception: Time-out: https://www.googleapis.com/batch/drive/v3 at [unknown function](Code:63) at Do(Code:8) at importXLSXtoGsheet(Code:71)

importXLS 폴더에 1 개의 파일로 함수를 실행하면 제대로 작동합니다.

스크립트 설명 :

각각 하나의 스프레드 시트 파일을 포함하는 52 개의 폴더가 있습니다.
각 폴더는 다른 동료와 공유됩니다. 낮에는 사람들이 파일을 변경합니다.

  1. 하루가되면 모든 파일이 하나의 폴더 ( gsheetFolder )에 수집됩니다. ) 함수 collectAndExportXLS 를 사용하여 XLSX 파일로 변환 .
이 파일들은 저녁에 로컬 서버로 복사되고 (일괄 처리 스크립트 및 드라이브 동기화 사용) 파일의 다른 정보를 업데이트하고 importXLSXfolder 로 다시 복사됩니다. .

  1. 아침에 importXLSXtoGsheet  기능은 importXLSXfolder 에서 모든 XLSX 파일을 실행하고 변환합니다   gsheetFolder 에서 Gsheet 파일로 폴더 .
  2. sortGsheetFiles 후  52 개의 폴더 중 하나에서 모든 Gsheet 파일을 실행, 정렬 및 이동합니다 (현재 스프레드 시트의 배열 목록 사용).

기타 작업에는 deleteFolder 로 폴더 정리가 포함됩니다.  기능.

스크립트 :

var gsheetFolder = '###';
var XLSXfolder = '###';
var importXLSXfolder = '###';
// Modified
function deleteFolder(folderId) {
  var url = "https://www.googleapis.com/drive/v3/files?q='" + folderId + "'+in+parents+and+trashed%3Dfalse&fields=files%2Fid&access_token=" + ScriptApp.getOAuthToken();
  var res = UrlFetchApp.fetch(url);
  var obj = JSON.parse(res.getContentText());
  var reqs = obj.files.map(function(e) {return {method: "DELETE", endpoint: "https://www.googleapis.com/drive/v3/files/" + e.id}});
  var requests = {batchPath: "batch/drive/v3", requests: reqs};
  if (requests.requests.length > 0) BatchRequest.Do(requests);
}
// Added
function deleteFiles(files) {
  var reqs = files.map(function(e) {return {method: "DELETE", endpoint: "https://www.googleapis.com/drive/v3/files/" + e.id}});
  var requests = {batchPath: "batch/drive/v3", requests: reqs};
  if (requests.requests.length > 0) BatchRequest.Do(requests);
}
// Added
function getValuesFromSpreadsheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  return sheet.getRange("A2:B53").getValues();
}
// Modified
function sortGsheetFiles() {
  var url = "https://www.googleapis.com/drive/v3/files?q='" + gsheetFolder + "'+in+parents+and+mimeType%3D'" + MimeType.GOOGLE_SHEETS + "'+and+trashed%3Dfalse&fields=files(id%2Cname)&access_token=" + ScriptApp.getOAuthToken();
  var res = UrlFetchApp.fetch(url);
  var obj = JSON.parse(res.getContentText());
  var values = getValuesFromSpreadsheet();
  var reqs = values.reduce(function(ar, e) {
    for (var i = 0; i < obj.files.length; i++) {
      if (obj.files[i].name == e[0]) {
        ar.push({
          method: "PATCH",
          endpoint: "https://www.googleapis.com/drive/v3/files/" + obj.files[i].id + "?addParents=" + e[1] + "&removeParents=" + gsheetFolder,
        });
        break;
      }
    }
    return ar;
  }, []);
  var requests = {batchPath: "batch/drive/v3", requests: reqs};
  if (requests.requests.length > 0) BatchRequest.Do(requests);
  deleteFolder(importXLSXfolder);
}
// Modified
function importXLSXtoGsheet(){
  deleteFolder(XLSXfolder);
  var url = "https://www.googleapis.com/drive/v3/files?q='" + importXLSXfolder + "'+in+parents+and+mimeType%3D'" + MimeType.MICROSOFT_EXCEL + "'+and+trashed%3Dfalse&fields=files(id%2Cname)&access_token=" + ScriptApp.getOAuthToken();
  var res = UrlFetchApp.fetch(url);
  var obj = JSON.parse(res.getContentText());
  var reqs = obj.files.map(function(e) {return {
      method: "POST",
      endpoint: "https://www.googleapis.com/drive/v3/files/" + e.id + "/copy",
      requestBody: {mimeType: MimeType.GOOGLE_SHEETS, name: e.name + ".xlsx", parents: [gsheetFolder]},
    }
  });
  var requests = {batchPath: "batch/drive/v3", requests: reqs};
  if (requests.requests.length > 0) BatchRequest.Do(requests);
  deleteFolder(importXLSXfolder);
}
// Modified
function ConvertBackToXLS(fileList) {
  var token = ScriptApp.getOAuthToken();
  var reqs1 = fileList.map(function(e) {return {
      method: "GET",
      url: "https://docs.google.com/spreadsheets/export?id=" + e.id + "&exportFormat=xlsx&access_token=" + token,
    }
  });
  var res = UrlFetchApp.fetchAll(reqs1);
  var reqs2 = res.map(function(e, i) {
    var metadata = {name: fileList[i].name, parents: [XLSXfolder]};
    var form = FetchApp.createFormData(); // Create form data
    form.append("metadata", Utilities.newBlob(JSON.stringify(metadata), "application/json"));
    form.append("file", e.getBlob());
    var url = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
    return {url: url, method: "POST", headers: {Authorization: "Bearer " + token}, body: form};
  });
  FetchApp.fetchAll(reqs2);
}
// Modified
function collectAndExportXLS() {
  deleteFolder(gsheetFolder);
  var values = getValuesFromSpreadsheet();
  var reqs1 = values.reduce(function(ar, e) {
    if (e[0] && e[1]) {
      ar.push({
        method: "GET",
        endpoint: "https://www.googleapis.com/drive/v3/files?q='" + e[1] + "'+in+parents+and+trashed%3Dfalse&fields=files(id%2Cname)",
      });
    }
    return ar;
  }, []);
  var resForReq1 = BatchRequest.Do({batchPath: "batch/drive/v3", requests: reqs1});
  var temp = resForReq1.getContentText().split("--batch");
  var files = temp.slice(1, temp.length - 1).map(function(e) {return JSON.parse(e.match(/{[\S\s]+}/g)[0])});
  var fileList = files.reduce(function(ar, e) {return ar.concat(e.files.map(function(f) {return f}))}, []);
  ConvertBackToXLS(fileList);
  deleteFiles(fileList);
}


  • 답변 # 1

    질문에 대해 다음과 같이 이해할 수 있습니다.

    와이즈 비즈  파일 52 개로 실행되면 오류가 발생합니다.

    와이즈 비즈  파일이 13 개 미만인 경우 오류가 발생하지 않습니다.

    importXLSXtoGsheet() 를 제외한 다른 기능  잘 작동합니다.

    하나의 해결 방법으로 내 이해가 정확하면 파일을 처리하는 최대 수를 한 번 결정합니다. 이것이 importXLSXtoGsheet() 에 반영 될 때  스크립트의 수정 된 스크립트는 다음과 같습니다.

    수정 된 스크립트 :
    importXLSXtoGsheet()
    
    
    참고 :

    이 샘플 스크립트에서 배치 요청마다 10 개의 파일이 처리됩니다. 이것을 변경하려면 importXLSXtoGsheet() 를 수정하십시오 .

    function importXLSXtoGsheet(){ deleteFolder(XLSXfolder); var url = "https://www.googleapis.com/drive/v3/files?q='" + importXLSXfolder + "'+in+parents+and+mimeType%3D'" + MimeType.MICROSOFT_EXCEL + "'+and+trashed%3Dfalse&fields=files(id%2Cname)&access_token=" + ScriptApp.getOAuthToken(); var res = UrlFetchApp.fetch(url); var obj = JSON.parse(res.getContentText()); // I modified below script. var n = 10; // Maximum number. var files = []; var len = obj.files.length; for (var i = 0; i < len; i++) { files.push(obj.files.splice(0, n)); len -= n - 1; } files.forEach(function(f) { var reqs = f.map(function(e) {return { method: "POST", endpoint: "https://www.googleapis.com/drive/v3/files/" + e.id + "/copy", requestBody: {mimeType: MimeType.GOOGLE_SHEETS, name: e.name + ".xlsx", parents: [gsheetFolder]}, } }); var requests = {batchPath: "batch/drive/v3", requests: reqs}; if (requests.requests.length > 0) BatchRequest.Do(requests); }); deleteFolder(importXLSXfolder); }

관련 자료

  • 이전 google cloud platform - Pubsub 메시지에 타임 스탬프 속성이 없습니다
  • 다음 java - Android 앱을 시작할 때 GIF가 표시되지 않습니다