0
votes

I have created a Google Form that logs Timestamps, a numerical value, and an image file from its respondents to a Google Sheet. The image files are saved to an "imageFolder", but when I get too many responses, my imageFolder and Google Sheet get too large. Ideally, I want my imageFolder and its Google Sheet to stay below 50 entries.

I want to move the 10 oldest images in imageFolder to waitFolder. I want to save an array of those oldest values from column "How many?" before the entry is deleted. Then I want any new entries to replace the oldest ones who's information I have already save to waitFolder and the howMany() array (myArray10).

I know I have to move 10 images from "imageFolder" to "waitFolder" using functions along the lines of:

var text1 = "Response Form";
var text2 = "imageFolder";
var text3 = "Copy of imageFolder";
var text4 = "Wait Folder"

function moveFiles(sourceFileId, targetFolderId) {
  var myFolder = DriveApp;
  var files = myFolder.getFileById(sourceFileId).getFiles()
  while (files.hasNext()) {
    var file = files.next());
    var dest = myFolder.getFolderById(targetFolderId);
    dest.addFile(file);
    var pull = DriveApp.getFolderById(sourceFolderId);
    pull.removeFile(file);
  }
}


function getMyId(text) {                   
  var Ids = [];
  var myFolder = DriveApp;
  var folderIter = myFolder.getFoldersByName(text);
  var folder = folderIter.next();
  var folderIter = folder.getFiles();
  while(folderIter.hasNext()) {
    var file = folderIter.next();
    var fileId = file.getId();
    Ids.push(fileId);
  }
  return Ids
}

function getMyId10(text) {                   
  var Ids = [];
  var myFolder = DriveApp;
  var folderIter = myFolder.getFoldersByName(text);
  var folder = folderIter.next();
  var folderIter = folder.getFiles();
  for (var i = 0; i < 10; i++) {  //Take the first 10
    while(folderIter.hasNext()) {
      var file = folderIter.next();
      var fileId = file.getId();
      Ids.push(fileId);
    }
  }   
  return Ids
}

function main() {
  var imageFolderId = getMyId(text2);
  var imageFolderId10 = getMyId10(text2);
  var waitFolderId = getMyId(text4);
  var Copy_imageFolderId = getMyId(text3);
  moveFiles(imageFolderId, Copy_imageFolderId); //make a copy of imageFolder
  moveFiles(imageFolderId10, waitFolderId);     //Move first 10, remove from original
}

How can I move images from imageFolder to Copy_imageFolder? How can I move the 10 oldest images from imageFolder to waitFolder? How can I remove the 10 oldest images from imageFolder? How can I limit the number of rows in my spreadsheet using Google script? How can I overwrite my oldest rows with new entries/rows?

edit1: I am getting unexpected tokens in every function, and I am unsure why? It seems to pop up in the while loop of my function getMyId().

edit2: I see now why I was getting unexpected tokens. It seems that I was being irresponsible with my loops. I have replaced my 'while's with 'for's to amend this mistake.

edit3: I removed some unnecessary snippets of code to make it easier to follow.

edit4: enter image description here Here is what my Form Response looks like in my Spreadsheet. The images are saved to subfolder imageFolder. But I can't grab the 10 array elements I want from the spreadsheet using howMany(). I also can't seem to move any of the files anywhere. When I call on moveFiles(), I get an unexpected error as soon as it asks for my DriveApp. How do I make my moveFiles() move my images from source to target folders?

1
Hello @AlejandroBarrientos, so essentially you want to have the 10 newest entries in the Sheet and the rest of the entries saved in a folder? Cheers! - ale13
Hello there! @ale13, actually I want the 10 oldest responses in my sheet to be saved in a folder/spreadsheet. And incase there are any new responses, hopefully they just overwrite those rows that I've already saved to another folder. Thanks! - Alejandro Barrientos
What is it that you store in the spreadsheet? Perhaps you can share an image of the spreadsheet tab and explain what the purpose is. - Cooper
Hello @Cooper, I've shared an image of what my spreadsheet looks like along with how my images are being saved to imageFolder. The whole script is supposed take images and delete them after a few days. So once my waitFolder is populated, I keep the images for a few days, then I run the code again, remove anything in waitFolder, then refill waitFolder with 10 of the oldest images from imageFolder again. - Alejandro Barrientos
This doesn't make any sense var files = myFolder.getFileById(sourceFileId).getFiles() How do get files out of a file. - Cooper

1 Answers

1
votes

Perhaps this is what you were looking for:

function moveFiles(sourceFolderId, targetFolderId) {
  var srcFolder=DriveApp.getFolderById(sourceFolderId);
  var desFolder=DriveApp.getFolderById(targetFolderId);
  var files=srcFolder.getFiles();
  while(files.hasNext()) {
    var file=files.next();
    desFolder.addFile(file);
    srcFolder.removeFile(file)
  }
}