web-dev-qa-db-fra.com

Créer un nouveau fichier dans un dossier avec Apps Script à l'aide du service Google Advanced Drive

Il existe quatre façons de créer un nouveau fichier:

  • DocsList - Affiché sous DocsList dans la liste principale. Construit dans Apps Script.
  • DriveApp - affiché sous la forme Drive dans la liste principale. Construit dans Apps Script.
  • Drive API - Également affiché sous la forme Drive dans la liste principale. Doit être ajouté au script Apps.
  • DocumentApp - affiché sous la forme Document dans la liste principale. Intégré, mais crée uniquement un fichier de document.

Ils s'appellent tous services . L'API de lecteur s'appelle un service avancé . Alors, lequel devriez-vous utiliser? Je ne sais pas, ça dépend. Cette question concerne le Drive API Advanced Service.

Je ne veux pas utiliser 2 ou 3 des services pour faire le travail. J'aimerais juste en utiliser un. Mais pour décider lequel utiliser, j'ai besoin de connaître les capacités et les options de chacun d'entre eux. Si le plus simple et le plus facile à utiliser fait tout ce que je veux, alors je l'utilise.

Si je peux créer un nouveau fichier avec Drive API, mais que je dois ensuite utiliser le service DriveApp pour déplacer le fichier que j'ai créé avec Drive API, dans le dossier dans lequel je le souhaite, utiliser Drive API dans cette situation particulière est inutile.

Je peux créer un nouveau fichier dans Google Drive à partir d'un code Google Apps Script .gs, mais le fichier est écrit dans le dossier principal "My Drive". Je veux écrire le fichier directement dans un sous-dossier. Mon code actuel est:

var fileNameSetA = 'someFile.jpg';
var uploadedBlobA = an image uploaded with a file picker;

var fileTestDrive = {
  title: fileNameSetA,
  mimeType: 'image/jpeg'
};

fileTestDrive = Drive.Files.insert(fileTestDrive, uploadedBlobA);

Même si le code fonctionne, je ne sais pas pourquoi la syntaxe est la même, et je ne trouve pas de documentation qui explique pourquoi. Je peux trouver une liste de propriétés:

Le title: et le mimeType: sont des propriétés facultatives faisant partie du Request Body. Dans cet exemple, les propriétés facultatives sont évidemment placées dans un objet clé: valeur appariée. Alors, la syntaxe:

Drive.Files.insert(optional properties, content);

Il existe également des paramètres de requête obligatoires de:

uploadType -> media, multipart, resumable

Mais je ne vois pas de paramètre uploadType obligatoire désigné nulle part dans l'exemple de code. Donc, je ne comprends pas la documentation de Google.

Insert de documentation Google

Est-il possible d'écrire directement sur un lecteur spécifique avec le service Google Advanced Drive dans un fichier de code .gs Script Apps? Comment fait-on ça?

11
Sandy Good

La documentation pour INSERT pour le Drive API se trouve sur ce lien:

Drive API for INSERT

Il y a une section pour Corps de la requête. Une des Propriétés facultatives pour Insérer est parents []. Les crochets [] indiquent qu'une liste de parents peut être désignée. La documentation pour parents [] indique ceci:

Collection de dossiers parents contenant ce fichier. La définition de ce champ Place le fichier dans tous les dossiers fournis. Lors de l'insertion, si Aucun dossier n'est fourni, le fichier sera placé dans le dossier racine par défaut .

Alors, . . . using Insert in Drive API,. . . . PEUT écrire un nouveau fichier directement dans un sous-dossier. C'est possible.

Désormais, la nomenclature et la syntaxe du SDK Google Drive, requête HTTP sont différentes de celles contenues dans le script Apps.

La syntaxe permettant d’appeler la requête HTTP de l’API de lecteur dans un fichier .gs est l’un des trois suivants:

  • Drive.Files.insert (ressource FILE)
  • Drive.Files.insert (ressource FILE, BLOB mediaData)
  • Drive.Files.insert (ressource FILE, BLOB mediaData, OBJECT optionalArgs)

La syntaxe indiquée dans la liste ci-dessus provient de la liste déroulante Saisie automatique située à l'intérieur de l'éditeur de code Apps Script. Si vous tapez Drive.Files., une liste de méthodes possibles apparaîtra. Je ne trouve aucune information sur la syntaxe dans la documentation en ligne.

Alors, où vont les parents [] biens facultatifs? Eh bien, ce n'est pas un blob, donc nous pouvons l'exclure. C'est soit FILE resource, soit OBJECT optionalArgs. optionalArgs indique qu'il s'agit d'un objet, mais FILE resource est également un objet.

Dans les exemples, le FILE resource est construit sous la forme d'un objet clé: paire de valeurs.

Chargement de fichiers - Advanced Drive Service - Documentation Google

3
Sandy Good

C’est peut-être un peu tard, mais si vous examinez les REST API Docs } _, vous pouvez utiliser Drive.Files.insert pour les insérer dans n’importe quel dossier. Vous devez simplement ajouter l'ID du dossier dans les propriétés du fichier que vous insérez en tant que tel:

var file = {
   title: 'myFile',
   "parents": [{'id':folder.getId()}],  //<--By setting this parent ID to the folder's ID, it creates this file in the correct folder.
   mimeType: 'image/png'
 };

L'ID de dossier peut être obtenu à partir du lien pouvant être partagé à l'aide de l'interface graphique de Google Drive ou comme indiqué ici . (par exemple, utilisez la fonction Execute à droite.)

Sinon, vous pouvez accéder au dossier par son nom en remplaçant la folder.getID() par Drive.getFoldersByName('name of folder') .

Ceci est utile car Drive.Files.insert() accepte les arguments alors que Drive.createFile() et Drive.createFolder() ne le font pas. 

10
morrows_end

Le moyen le plus simple de créer un nouveau fichier consiste à utiliser DriveApp fourni avec le script Google Apps pur:

var dir = DriveApp.getFolderById("{dir_id}");
var file = dir.createFile(name, content);

Si vous ne connaissez pas l'identifiant exact du répertoire, vous pouvez obtenir le dossier par son nom:

var dir = DriveApp.getFoldersByName(name).next();

La next() est présente car getFoldersByName() renvoie la collection de tous les répertoires dont les noms correspondent à la valeur donnée. 

Consultez également DriveApp docs: https://developers.google.com/apps-script/reference/drive/drive-app

7
Lucas Wa

J'ai pu utiliser DriveApp pour créer un fichier dans un dossier spécifié de cette façon.

var driveFolder = DriveApp.getFolderByName("MyDriveFolder");
var file = driveFolder.createFile(formObject.txtReceipt);
file.setName("MyFile");    

PS: formObject.txtReceipt provient d'un contrôle de téléchargement de fichier sur un formulaire au format HTML, ce qui renvoie un blob.

0
Ruch