Skip to content

Instantly share code, notes, and snippets.

@eojji
Last active June 26, 2018 01:01
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 eojji/1cd5ea824a2dca8d0fb36ac898d5e988 to your computer and use it in GitHub Desktop.
Save eojji/1cd5ea824a2dca8d0fb36ac898d5e988 to your computer and use it in GitHub Desktop.
Copy files by spreadsheet. Listing folders - 5 https://m.cafe.naver.com/eojji/306
/*
* check: 파일 복사 함수 호출의 반환값으로 다음 작업을 결정합니다.
* '1': 계속 진행
* '-1': 프로세스 중단
* '-2': after 트리거 생성
* '-3': hour 트리거 생성
**/
function callFileCopy_(title, id, parentId) {
var copiedState = {
copy: '1',
link: '', // or Error name
message: 'Ok',
check: '1'
}
var resource = {
'title': title,
parents: [{ id: parentId }]
};
var optionalArgs = {
supportsTeamDrives : true
};
var resp;
try {
resp = Drive.Files.copy(resource, id, optionalArgs);
if (resp && resp.id) {
copiedState.link = resp.alternateLink;
return copiedState;
}
} catch(error) {
resp = error; // error.name, error.message;
}
copiedState.copy = '0'; // Not copy
var rowContents;
var logSpreadSheet = getLogSpreadSheet();
var thisFunctionName = 'Call Drive.Files.copy';
var email = Session.getEffectiveUser().getEmail();
if (!resp || !resp.name) {
console.warn('%s, Error !resp.name, Title: %s - %s', email, title, thisFunctionName);
rowContents = ['Error, No response', 'Title: '+title, 'at '+thisFunctionName];
logSheetAppendRow(logSpreadSheet, rowContents);
copiedState.link = '';
copiedState.message = '';
copiedState.check = '-2';
return copiedState;
}
copiedState.link = resp.name;
copiedState.message = resp.message;
console.warn('%s, Error: %s, Message: %s, Title: %s - %s', email, resp.name, resp.message, title, thisFunctionName);
rowContents = ['Error: '+resp.name, 'Message: '+resp.message, 'Title: '+title, 'at '+thisFunctionName];
logSheetAppendRow(logSpreadSheet, rowContents);
if (resp.message.indexOf('User rate limit exceeded') >= 0) {
copiedState.check = '-3'; // create trigger, hour
} else if (resp.message.indexOf('The user has exceeded') >= 0 ||
resp.message.indexOf('The file limit for this Team Drive') >= 0) {
copiedState.check = '-1'; // process kill
} else {
copiedState.check = '1'; // Skip
// Error Name: Exception
// 'Internal Error'
// '빈 응답'
}
return copiedState;
}
function copyFilesBySheet_(startTime, sheet) {
var lastRow = sheet.getLastRow();
if (!lastRow || lastRow < 3) {
return '9';
}
var startRow = sheet.getRange('B1').getValue();
if (!startRow || startRow < 3) {
startRow = 3;
}
if (startRow > lastRow) {
return '9';
}
var rows = lastRow - startRow + 1;
var fileValues = sheet.getRange(startRow, 1, rows, 9).getValues();
var fileCont;
var valuesCopyfile = [];
for (var idx = 0; idx < rows; idx++) {
fileCont = fileValues[idx]
var title = fileCont[0];
var id = fileCont[1];
var parent = fileCont[8];
var copiedState = callFileCopy_(title, id, parent);
var arr = [copiedState.copy];
arr.push(copiedState.link);
arr.push(copiedState.message);
arr.push(copiedState.check);
valuesCopyfile.push(arr);
if (copiedState.check === '1') {
// console.log('copiedState.chek: %s === 1', copiedState.check);
} else {
console.log('%s Not === 1, break copyFilesBySheet, copiedState.chek', copiedState.check);
break;
}
if (!timeCheck(startTime, 30000)) { // needTime: 30 sec
break;
}
// end for var idx
}
var valuesLength = valuesCopyfile.length;
sheet.getRange(startRow, 5, valuesLength, valuesCopyfile[0].length).setValues(valuesCopyfile);
var readToRow = (copiedState.check === '1') ? (startRow + valuesLength) : (startRow + valuesLength - 1);
sheet.getRange('B1').setValue(readToRow);
if (idx >= rows) {
return '9';
}
return copiedState.check;
}
function timeCheck(startTime, needTime) {
var nowDate = new Date();
// remain = 6 min - ( now - start )
var remain = 360000 - (nowDate.getTime() - startTime);
if (remain < needTime) {
return false;
} else {
return true;
}
}
function createLogSpreadSheet() {
var ss = SpreadsheetApp.create('_Log ' + Date.now());
var sheet = ss.getSheets()[0];
sheet.appendRow(['Time', 'Message']);
PropertiesService.getUserProperties().setProperty('LOG_SS_ID', ss.getId());
return ss;
}
function getLogSpreadSheet() {
var logSpreadSheetId = PropertiesService.getUserProperties().getProperty('LOG_SS_ID');
if (! logSpreadSheetId || logSpreadSheetId.length < 10) {
return createLogSpreadSheet();
}
try {
var file = DriveApp.getFileById(logSpreadSheetId);
if (file.isTrashed()) {
return createLogSpreadSheet();
} else {
return SpreadsheetApp.openById(logSpreadSheetId);
}
} catch(e) {
return createLogSpreadSheet();
}
}
function logSheetAppendRow(ssLog, rowContents) {
rowContents.unshift(new Date());
ssLog.getSheets()[0].appendRow(rowContents);
}
function myFunction() {
var ssId = '??? 1S3YnsvFA';
var ss = SpreadsheetApp.openById(ssId);
var startTime = Date.now();
var sheetFiles = ss.getSheets()[1];
console.log('ss name: %s', ss.getName());
var resp = copyFilesBySheet_(startTime, sheetFiles);
console.log('copyFilesBySheet resp: %s', resp);
}
@eojji
Copy link
Author

eojji commented Jun 23, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment