@chv הקוד שלי הוא כזה:
לשחזור:
function getAllFilesAndDiresToUpload(path, parentFolder)
{
Logger.log("מתחיל למצוא קבצים");
Logger.log("התיקיה היא: " + parentFolder.getName());
let urls = [], urlsBigFiles = [];
// מטפל בצד של ימות המשיח, פחות חשוב לעניננו
if(path!=""){
let tempCreateExtUrl = createExtUrl.replace("{token}", token);
tempCreateExtUrl += path;
Logger.log("יוצר תיקיה: " + path);
let res = UrlFetchApp.fetch(tempCreateExtUrl, {muteHttpExceptions: true});
let data = JSON.parse(res.getContentText());
if (!data || data.responseStatus !== "OK") {
sheet.appendRow(["איראה שגיאה", data.message]);
Logger.log("שגיאה");
return HtmlService.createHtmlOutput("שגיאה");
}
}
// עובר על הקבצים שנמצאים בתיקיה שהועברה כפרמטר (בגוגל דרייב)
// עושה מהם רשימה שיוכלו לעבור עליה ולהעלות את כל הקבצים ששם
let files = parentFolder.getFiles();
while(files.hasNext())
{
let file = files.next();
if (file.getSize() > 52428800) {
urlsBigFiles.push(file);
}
else{
urls.push(file);
Logger.log("נמצא קובץ: " + file.getName());
}
}
// קורא לפונקציה שמעלה את הקבצים
uploadFiles(urls, path);
// מושך את כל התת תיקיות של התיקיה שהועברה כפרמטר
let folders = parentFolder.getFolders();
// עובר על כל תיקיה
while(folders.hasNext())
{
let folder = folders.next();
// מפעילה עליה את הפונקציה הנוכחית ומעביר את התיקיה הנבחרת כפרמטר
getAllFilesAndDiresToUpload(path+"/"+folder.getName() ,folder);
}
}
לגיבוי
function getAllFilesAndDires1(path, parentFolder){
let filesTodownload=[];
// החלק של ימות המשיח, לא רלוונטי לנו.
let tempGetDirDataUrl = getDirDataUrl.replace("{token}", token);
tempGetDirDataUrl += path;
let res = UrlFetchApp.fetch(tempGetDirDataUrl, {muteHttpExceptions: true});
let data = JSON.parse(res.getContentText());
if (!data || data.responseStatus !== "OK") {
sheet.appendRow(["איראה שגיאה", data.message]);
Logger.log("שגיאה");
return HtmlService.createHtmlOutput("שגיאה");
}
// עובר על כל סוגי הקבצים ומוסיף אותם לרשימה שבה משתמשים אח"כ כדי להוריד את הקבצים
if (data.files && data.files.length)
{
data.files.forEach(file => {
let tempGetFileUrl = getFileUrl.replace("{token}", token) + encodeURIComponent(file.what);
filesTodownload.push([file.name,tempGetFileUrl]);
if(file.meta != null && !(file.what.endsWith(".ygmr")))
{
tempGetFileUrl = getFileUrl.replace("{token}", token) + encodeURIComponent(file.what.replace(/\.[^/.]+$/, ".txt"));
filesTodownload.push([file.name.replace(/\.[^/.]+$/, ".txt") ,tempGetFileUrl]);
}
})
}
if (data.ini && data.ini.length)
{
data.ini.forEach(ini => {
let tempGetFileUrl = getFileUrl.replace("{token}", token) + encodeURIComponent(ini.what)
filesTodownload.push([ini.name,tempGetFileUrl]);
})
}
// קורא לפונקציה להורדת הקבצים
DownloadFile(filesTodownload, parentFolder);
//אם יש תת תיקיות
if (data.dirs && data.dirs.length)
{
// עובר עליהם
data.dirs.forEach(dir => {
if (dir.what !== "ivr2:/Trash"){
// יוצר תיקיה (בדרייב) בתוך התיקיה שהועברה כפרמטר באותו השם של התיקיה בימות המשיח
const subFolder = parentFolder.createFolder(dir.name);
// קורא לפנוקציה עצמה שוב, עם התיקיה החדשה שנוצרה כפרמטר
getAllFilesAndDires1(dir.what, subFolder);
}
})
}
}
כיום אני עובד על קוד כזה (עוד לא בדקתי אותו, מאמין שיש שגיאות)
שמים בשיטס את הנתיב של תיקית האב ומפעילים
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
let dirInDataIndex = Number(PropertiesService.getScriptProperties().getProperty("dirInDataIndex"));
let dirIndex = Number(PropertiesService.getScriptProperties().getProperty("dirIndex"));
let dirList = sheet.getRange(1,1,sheet.getLastRow()-1,2).getValues();
const startTime = Date.now();
function getDirs(){
// בודק אם יש בשיטס תיקיות שעוד לא עברו עליהם
while (dirInDataIndex<dirList.length)
{
let newDirList=[];
// החלק של ימות המשיח
let tempGetDirDataUrl = getDirDataUrl.replace("{token}", token);
tempGetDirDataUrl += dirList[dirInDataIndex][0];
dirInDataIndex++;
let res = UrlFetchApp.fetch(tempGetDirDataUrl, {muteHttpExceptions: true});
let data = JSON.parse(res.getContentText());
if (!data || data.responseStatus !== "OK") {
sheet.appendRow(["איראה שגיאה", data.message]);
Logger.log("שגיאה");
return HtmlService.createHtmlOutput("שגיאה");
}
// אם יש תיקיות
if (data.dirs && data.dirs.length)
{
for(let i = dirIndex ; i < data.dirs.length ; i++){
// יוצר תיקיה כשם התיקיה בימות המשיח
const subFolder = parentFolder.createFolder(data.dirs[i].name)
// שומר במערך את שם התיקיה ואת הID שלה בדרייב
newDirList.push([data.dirs[i].name, subFolder.getId()]);
//בודק אם עברו 5 דקות
if ((Date.now() - startTime) > 300000)
{
//אם כן, שומר את מצב המעבר בפרופרטיס ואת מערך התיקיות ששמרו עד עכשיו - בשיטס PropertiesService.getScriptProperties().setProperty("dirInDataIndex",dirInDataIndex);
PropertiesService.getScriptProperties().setProperty("dirIndex", i+1);
sheet.getRange(dirList.length,1,newDirList.length,2).setValues(newDirList);
יוצר טריגר שימשיך את המעבר
ScriptApp.newTrigger("getDirs").timeBased().after(10 * 1000).create();
return;
}
}
PropertiesService.getScriptProperties().setProperty("dirIndex", 0);
}
}
// אם אין עוד תיקיות מוחק את כל הטריגרים שנוספו
ScriptApp.getProjectTriggers().forEach(trigger => {
if (trigger.getHandlerFunction() == "getDirs")
{ScriptApp.deleteTrigger(trigger);}
});
}