Comment puis-je optimiser mon script pour respecter la limite de temps de Google Apps Script de 6 minutes ?
P粉579008412
P粉579008412 2023-09-07 17:55:10
0
1
645

En tant que débutant, j'ai écrit un script pour remplir tous mes dossiers Google Drive dans Google Sheets. Même si le script fonctionne, je tombe sur 错误:超过最大执行时间 et la liste des résultats de mon dossier n'est pas encore complète.

Je n'arrive pas à comprendre comment gérer/corriger les délais d'attente d'exécution. J'ai recherché plusieurs sources mais je n'ai rien trouvé qui puisse m'aider à accélérer mon script.

Je m'attends à ce que le script s'exécute très rapidement et que la liste des milliers de dossiers "éventuellement" soit remplie en 1 minute maximum.

Script GAS

function generateFolderList() {
  var rootFolder = DriveApp.getRootFolder();
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = Utilities.formatDate(new Date(), "GMT+1", "yyyy-MM-dd HH:mm:ss");
  var newSheet = spreadsheet.insertSheet(sheetName);
  newSheet.getRange("A1:N1").setValues([["structure_level", "parent_folder", "folder_name", "folder_description", "folder_id", "folder_url", "owner_email", "sharing_access", "sharing_permissions", "mime_type", "starred_status", "trashed_status", "date_created", "last_updated"]]);
  listFolders(rootFolder, "", newSheet, 1);
}

function listFolders(folder, parentName, sheet, level) {
  var folderName = folder.getName();
  var description = folder.getDescription();
  var folderId = folder.getId();
  var url = folder.getUrl();
  var owner = folder.getOwner().getEmail();
  var sharingAccess = folder.getSharingAccess();
  var sharingPermission = folder.getSharingPermission();
  var mimeType = "folder";
  var starred = folder.isStarred();
  var trashed = folder.isTrashed();
  var dateCreated = folder.getDateCreated();
  var lastUpdated = folder.getLastUpdated();
  
  var rowData = [level, parentName, folderName, description, folderId, url, owner, sharingAccess, sharingPermission, mimeType, starred, trashed, dateCreated, lastUpdated];
  sheet.appendRow(rowData);
  
  var subFolders = folder.getFolders();
  level++;
  while (subFolders.hasNext()) {
    var subFolder = subFolders.next();
    listFolders(subFolder, folderName, sheet, level);
  }
}

Google Sheets avec Apps Script est ici.

P粉579008412
P粉579008412

répondre à tous(1)
P粉775788723

Votre script d'application écrit dans la feuille de calcul à mesure que chaque dossier ou sous-dossier apparaît. Au lieu de cela, vous devez collecter les informations dans un tableau, puis écrire l'intégralité du tableau dans une feuille de calcul. Essayez ceci, même si au départ certaines des valeurs des cellules sont des objets plutôt que des chaînes, cela ne fonctionnera donc pas tant que vous n'aurez pas décidé quelle propriété de ces objets vous souhaitez capturer. Je viens d'utiliser toString().

function generateFolderList() {
  var rootFolder = DriveApp.getRootFolder();
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = Utilities.formatDate(new Date(), "GMT+1", "yyyy-MM-dd HH:mm:ss");
  var newSheet = spreadsheet.insertSheet(sheetName);
  // 注意我创建了一个名为folders的数组,并将其传递给listFolders,而不是newSheet
  let folders = [["structure_level", "parent_folder", "folder_name", "folder_description", "folder_id", "folder_url", "owner_email", "sharing_access", "sharing_permissions", "mime_type", "starred_status", "trashed_status", "date_created", "last_updated"]];
  listFolders(rootFolder, "", folders, 1);
  // 完成后复制到电子表格
  newSheet.getRange(1,1,folders.length,folders[0].length.setValues(folders);
}

function listFolders(folder, parentName, folders, level) {
  var folderName = folder.getName();
  var description = folder.getDescription();
  var folderId = folder.getId();
  var url = folder.getUrl();
  var owner = folder.getOwner().getEmail();
  var sharingAccess = folder.getSharingAccess().toString();
  var sharingPermission = folder.getSharingPermission().toString();
  var mimeType = "folder";
  var starred = folder.isStarred();
  var trashed = folder.isTrashed();
  var dateCreated = folder.getDateCreated();
  var lastUpdated = folder.getLastUpdated();
  
  folders.push([level, parentName, folderName, description, folderId, url, owner, sharingAccess, sharingPermission, mimeType, starred, trashed, dateCreated, lastUpdated]);
  
  var subFolders = folder.getFolders();
  level++;
  while (subFolders.hasNext()) {
    var subFolder = subFolders.next();
    listFolders(subFolder, folderName, folders, level);
  }
}

Références

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal