I'm using this Google Script:
Gmail2GDrive
and it works like a charm except that I need it to overwrite the existing file as I'm intending to link to it and share it.
How would I need to modify this script?
You can't really overwrite a file in Google Drive. (Not that I am aware of.)
Each file has its own unique ID which means the name of the file is kind of irrelevant. (When attempting to override a file in the Windows Explorer terminology.)
That being said I have used this in the past to move files using Google App Script. Hope it helps:
//Get the ID of the Destination Folder
var destinationFolder = DriveApp.getFolderById("Your Folder ID");
//Create a copy of the Merged Sheets Temp and move to the Desitnation Folder.
DriveApp.getFileById(FileToMove.getId()).makeCopy("Give the File a name", destinationFolder);
//Move Merged Sheets Temp to Trash
var tempMergeDocument = DriveApp.getFileById(FileToMove.getId()).setTrashed(true)
Related
Using prior articles and questions found within stack overflow I was able to find a snippet of App Script that searches Gmail labels for attachments and moves them to a specific folder in Google Drive.
function saveAttachmentInFolder(){
var folder = DriveApp.getFolderById('xxosi2');
var userId = "please.thanks#gmail.com";
var query = "label:thankyoucards-reports";
var res = Gmail.Users.Messages.list(userId, {q: query});//I assumed that this works
res.messages.forEach(function(m){
var attA=GmailApp.getMessageById(m.id).getAttachments();
attA.forEach(function(a){
folder.createFile(a.copyBlob()).setName(a.getName());
});
});
}
I need to modify this code to perform the following additional functions:
If file exists, overwrite and retain version history
I have also played around with the answer found in the following thread to no avail as I believe this is hard coded in some way and too specific to the one file type (xlsx) Copying attachments from Gmail to Google Drive folder and overwriting old files with Apps Script.
I believe your goal is as follows.
You want to check this using the filename between the existing file in the folder and the attachment file.
You want to overwrite the existing file with the attachment file.
In this case, how about the following modification? In this case, Drive API is used. So, please enable Drive API at Advanced Google services.
From:
folder.createFile(a.copyBlob()).setName(a.getName());
To:
var filename = a.getName();
var files = folder.getFilesByName(filename);
if (files.hasNext()) {
Drive.Files.update({}, files.next().getId(), a.copyBlob(), {supportsAllDrives: true});
} else {
folder.createFile(a.copyBlob()).setName(filename);
}
When this modified script is run, the existing file is searched from the folder using the filename of the attachment file. When the file is found, the file is overwritten by the attachment file. When the file is not found, the file is created as a new file.
Note:
In this modified script, the existing file is overwritten. So, please be careful about this. I would like to recommend using a sample file for testing the script.
Reference:
Files: update of Drive API v2
The app script I'm running to move files with a certain name in the title to a new folder is copying the same files every time the script is run. Removing the files from the source folder doesn't seem to work.
Form responses are collected in a spreadsheet and an add-on is used to put the responses into a form that generates a new Google doc. The Google Docs is for all of our various buildings, which each have a unique name. The script should iterate through the file names and add the file to the specific buildings folder and then remove it from the folder that has every building altogether. When I run the script, it works, but on subsequent runs, all of the files that were copied before keep getting copied again with any new files in addition to it.
function movePittsburghFiles() {
var sourceFolder=DriveApp.getFolderById('taqwdGs4MUEyUEl1WQ8');
var destFolder = DriveApp.getFolderById('taqwV085WTVtdTdf');
var files = DriveApp.searchFiles('title contains "3N - Pittsburgh Weekly"');
while (files.hasNext()) {
var file = files.next();
destFolder.addFile(file);
sourceFolder.removeFile(file);
}
The script works, but it keeps finding the same files in the source folder that were already moved in previous runs of the code and copying them again. When I go to the folder in Google Drive, those files are not listed, but somehow the script keeps finding them.
Issue:
You're searching the whole drive, When you're calling .searchFiles() on DriveApp.
Solution:
Call .searchFiles() on the sourceFolder instead.
Snippet:
var files = sourceFolder.searchFiles('title contains "3N - Pittsburgh Weekly"');
References:
Folder#SearchFiles
For my work, each time we bring on a new client we need to create a new folder structure in google drive (the same structure for every account) and in one folder we generate a copy of a google sheet that we have. This is rather time consuming, so was hoping there was a way to easily duplicate a google drive folder structure and have it make a copy of the google sheet that we include in one of the folders.
The perfect result would be to easily copy/duplicate an exact folder structure (obviously renaming it for the client) and then have the folder have the copy of the google sheet in the correct folder already
Creating a folder structure
function createClientAccountFolder(brandName) {
//var brandName=brandName || 'BrandName';
var Template1=DriveApp.getFileById('TemplateId');//You need to add the id of your template here
var acctRoot=DriveApp.getFolderById('Accounts Root Folder Id');//you need to add the id of the root accounts folder here
if(brandName) {
var mainFldr=acctRoot.createFolder(Utilities.formatString('MainFolder-%s',brandName));
var liveFldr=mainFldr.createFolder(Utilities.formatString('%s-Live',brandName));
var editedFldr=mainFldr.createFolder(Utilities.formatString('%s-Edited',brandName));
var imgsFldr=liveFldr.createFolder('Images');
imgsFldr.createFolder('Ecommerce');
imgsFldr.createFolder('LifeStyles');
imgsFldr.createFolder('Model');
Template1.makeCopy(liveFldr);
}else{
SpreadsheetApp.getUi().alert('No Brand Name Specified')
}
}
You could enhance this script with a dialog that allows you to select different folders and possibly even add additional root account folders and the same with templates. But that is considerably more involved than what you have now.
I recently discovered this Google Apps Scripts feature and am wondering if my issue can be addressed by using that.
Let's say I have a machine generating new files (screenshots or videos taken from a capture card) that are being saved in a folder that is sync'd to my Google Drive. What I would like to do is somehow automatically generate a shareable link for each NEW file that gets added and send it to an email address (may or may not be a Gmail address).
Is this something that I can use Google Apps Scripts for? I tried looking into batch files first but I can't generate the shareable link automatically (or couldn't figure out how).
I don't have any code yet, just looking at potential approaches.
Thanks in advance!
Yes almost everything is possible in GAS. However, you are likely to find better answers when you post some code that you have tried yourself before asking the answer here.
However, if the machine automatically saves the files in a folder in google drive you can scan that folder with a script and find the links. Attach a trigger to it with a, for example, 5 minute interval and write those links on a spreadsheet.
an example:
function links(){
var sheet = SpreadsheetApp.getActive.getActiveSpreadsheet();
var folder = DriveApp.getFolderById('put google folder id here');
var files = folder.getFiles();
while (files.hasNext()) {
var file = files.next();
var vals = file.getUrl();
sheet.getRange(your range you want to paste the link).setValues(vals);
}
}
This will find the links of all the files in the folder and paste that onto a google spreadsheet where the code is linked to.
Use that spreadsheet as a database and send an email by using that database.
I'm having an issue with the file handling of a Google Sheet that is produced from another Google Sheet when I run a google apps script. When I run the script, a new output file is produced and sent to folders with a specific label. The goal is to have the output file added to a specific folder in a group drive. The script and files regarding my problem all reside on the group drive too fyi.
When I run the script this is what happens.
A file is created within my personal Google Drive because I have a folder with the same exact name as the one on the group drive (this was my test environment for the script). This file on my drive has all the desired output within the Google Sheet. A file was also being added to the root of my drive, but the script now removes it from the root.
A file is created on the group drive, but it is completely empty. The file is correctly named, but there are no contents within the actual spreadsheet.
Here is the script that is handling the output file:
var sourceFilename = ss.getName();
var splitSourceFilename = sourceFilename.split("LMS");
var targetFilename = splitSourceFilename[0] + "Allowed_Layers_Vx";
// move the new spreadsheet to Allowed Layers Lists folder
var folders = DriveApp.getFoldersByName("Allowed Layers Lists");
while (folders.hasNext()) {
var folder = folders.next();
var ssNew = SpreadsheetApp.create(targetFilename);
var copyFile = DriveApp.getFileById(ssNew.getId());
folder.addFile(copyFile);
DriveApp.getRootFolder().removeFile(copyFile);
}
Some other information about the Group Drive:
I did not create the Group Drive. It is shared with me
I am the owner of the folders in which the files and scripts reside.
I am the owner of all the files and scripts in these folders that I own too.
I have edit permissions at every level of this group drive.
there is nothing in your script above that actually does the "file copy". It just creating new empty file with SpreadsheetApp.create(targetFilename) and adding that to the folder.
To make a copy of the Google Sheet, you may refer to the answer at Google App Script: How do I make copy of spreadsheet and save it to particular folder?
I ended up moving that block of code to the end of the script after the data processing occurs. For some reason, within my own drive, it didn't matter when I added the file to another folder, the script would still update all instances of that file. However, within a group drive, only the file within my own root was being updated (till I moved that block of code to the end of the script).
Any explanations on why this occurs is welcome.