Skip to content

Instantly share code, notes, and snippets.

@gregorynicholas
Forked from eojji/doCopyFolder.gs
Created June 27, 2018 19:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gregorynicholas/be51e61e365431495912495468d626fc to your computer and use it in GitHub Desktop.
Save gregorynicholas/be51e61e365431495912495468d626fc to your computer and use it in GitHub Desktop.
// https://m.cafe.naver.com/eojji/307
function setPageTokenProperty(value) {
PropertiesService.getUserProperties().setProperty('PAGE_TOKEN', value);
}
function getPageTokenProperty() {
var pageTokenProperty = PropertiesService.getUserProperties().getProperty('PAGE_TOKEN');
return pageTokenProperty;
}
function deletePageTokenProperty() {
PropertiesService.getUserProperties().deleteProperty('PAGE_TOKEN');
}
function doCopyFolder_(sheetFolder, folderRowNum, sheetFiles, startTime) {
var folderRange, folderInfo;
try {
folderRange = sheetFolder.getRange(folderRowNum, 1, 1, 9);
folderInfo = folderRange.getValues()[0];
} catch(e) {
console.warn('Error: %s, %s - doCopyFolder', e.name, e.message);
return '-1';
}
var title, folderId, copyFolderId, fileRowNum;
title = folderInfo[0];
folderId = folderInfo[1];
copyFolderId = folderInfo[2];
fileRowNum = folderInfo[7];
if (!fileRowNum || fileRowNum < 3) {
var pageToken;
var objFiles = listFilesByPageToken_(folderId, pageToken, startTime);
if (!objFiles) {
return '9';
}
var parentId = folderInfo[8];
var resp = insertFolderById_(parentId, title);
if (!resp || !resp.id) {
console.warn('Error: %s, %s - insertFolderById(parentId: %s, %s)', resp.name, resp.message, parentId, title);
return '-1';
}
folderInfo[7] = sheetFiles.getLastRow() + 1; // fileRowNum
sheetAppendFiles_(resp.id, objFiles.files, sheetFolder, sheetFiles);
folderInfo[2] = resp.id; // copyFolderId
folderRange.setValues([folderInfo]);
if (objFiles.pageToken) {
setPageTokenProperty(folderId+','+objFiles.pageToken);
return '1';
}
return copyFilesBySheet_(startTime, sheetFiles);
}
var pageTokenProperty = getPageTokenProperty();
if (pageTokenProperty) {
var arrIdAndPageToken = pageTokenProperty.split(',');
if (arrIdAndPageToken[0] == folderId && arrIdAndPageToken[1]) {
var objFiles = listFilesByPageToken_(folderId, arrIdAndPageToken[1], startTime);
if (objFiles) {
sheetAppendFiles_(copyFolderId, objFiles.files, sheetFolder, sheetFiles);
if (objFiles.pageToken) {
setPageTokenProperty(folderId+','+objFiles.pageToken);
return '1';
}
}
} else {
deletePageTokenProperty();
}
}
return copyFilesBySheet_(startTime, sheetFiles);
}
function sheetAppendFiles_(parentId, data, sheetFolder, sheetFiles) {
if (!data || data.length < 1) {
return;
}
var folderData = [];
var newDate = new Date();
// title, id
// id2, files, fileSize, start, end, file row, parent
var newFolderContents = ['', 0, 0, newDate, newDate, 0, parentId];
var fileData = [];
// copy, name, message, check, parent
var newFileContents = ['', '', '', '', parentId];
var len = data.length;
for (var i = 0; i < len; i++) {
// title, id, mimeType, fileSize
var mimeType = data[i][2]; // mimeType
if (mimeType == 'application/vnd.google-apps.folder') {
folderData.push(data[i].slice(0, 2).concat(newFolderContents));
} else {
fileData.push(data[i].concat(newFileContents));
}
}
if (folderData && folderData.length > 0) {
sheetFolder.getRange(sheetFolder.getLastRow() + 1, 1, folderData.length, folderData[0].length).setValues(folderData);
}
if (fileData && fileData.length > 0) {
sheetFiles.getRange(sheetFiles.getLastRow() + 1, 1, fileData.length, fileData[0].length).setValues(fileData);
}
}
function insertFolderById_(parentId, folderName) {
var resource= {
"parents": [
{
"id": parentId
}
],
"title": folderName,
"mimeType": "application/vnd.google-apps.folder"
};
// https://stackoverflow.com/questions/28378738/create-a-new-blob-in-memory-using-apps-script
// var blob = Utilities.newBlob(folderName);
var optionalArgs = {
supportsTeamDrives : true
};
// var folder;
try {
// https://developers.google.com/drive/v2/reference/files#resource
return Drive.Files.insert(resource, Utilities.newBlob(folderName), optionalArgs);
} catch(error) {
return error;
}
}
function myFunction2() {
var ssId = '?????';
var ss = SpreadsheetApp.openById(ssId);
var startTime = Date.now();
var sheetFolder = ss.getSheetByName('folder');
var sheetFiles = ss.getSheetByName('files');
console.log('ss name: %s', ss.getName());
var folderRowNum = 12;
var resp = doCopyFolder_(sheetFolder, folderRowNum, sheetFiles, startTime);
console.log('doCopyFolder_ resp: %s', resp);
if (resp === '1') {
copyFilesBySheet_(startTime, sheetFiles);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment