Estoy usando Drive API v3 (Node.js) para crear un documento de Google con algunos datos. Más adelante, también quiero tener la posibilidad de "agregar" nuevos datos al documento de Google existente.

He escrito el siguiente código para crear un nuevo documento de Google en una carpeta determinada:

          var content = "Content to be written in file"
          var fileMetadata = {
            name: filename,
            parents: [rootFolderId]
          };
          var media = {
            mimeType: 'application/vnd.google-apps.document',
            body: content  // In the form of string
          };
          drive.files.create({
            resource: fileMetadata,
            multipart: media,
            fields: 'id', 
          })
          .then(function (response) {
              // Handle the response
              console.log(response.data.name, "File created")
            },
            function (err) {
              console.error(err);
          })

Mi pregunta es, ¿cómo puedo crear el Doc e inicializarlo con una cadena? Quiero que se pueda leer en Drive. En este momento, se está creando un archivo binario, con 'No hay vista previa disponible'.

Además, quiero tener una función para actualizar este documento (agregar) con una cadena. Me gusta esto:

         var media = {
            mimeType: 'application/vnd.google-apps.document',
            body: content_to_be_appended // in the form of string
          };
         drive.files.update({
            fileId: existingDocID,
            resource: fileMetadata,
            multipart: media,
            fields: 'id, name'
          })

Cualquier ayuda sería muy apreciada! ¡Gracias!

1
anomaly 26 sep. 2020 a las 23:34

2 respuestas

La mejor respuesta

Creo que su objetivo es el siguiente.

  • Su pregunta tiene las siguientes 2 preguntas.
    1. Desea conocer el método para crear un nuevo documento de Google, incluidos los datos de texto.
    2. Desea conocer el método para agregar más datos de texto al documento de Google existente.
  • Desea lograr esto utilizando la API de Drive con googleapis para Node.js.
  • Ya ha podido obtener y colocar el archivo utilizando Drive API.

Respuesta a la pregunta 1:

En esta respuesta, se crea un nuevo documento de Google al incluir los datos de texto mediante la API de Drive.

Puntos de modificación:

  • En este caso, es necesario convertir el texto al tipo de flujo.
  • Cuando el texto se convierte a Documento de Google, se requiere que mimeType se incluya en fileMetadata.

Cuando los puntos anteriores se reflejan en su guión, se convierte en lo siguiente.

Script modificado:

var content = "Content to be written in file"
var fileMetadata = {
  name: filename,
  parents: [rootFolderId]
};
var media = {
  mimeType: 'application/vnd.google-apps.document',
  body: content  // In the form of string
};
const stream = require("stream");

var filename = "sample filename";  // Please set the filename of created Google Document.
var rootFolderId = "root";  // Please set the folder ID.
var content = "Content to be written in file";

var bufferStream = new stream.PassThrough();
bufferStream.end(Uint8Array.from(Buffer.from(content, "binary")));
var fileMetadata = {
  name: filename,
  parents: [rootFolderId],
  mimeType: "application/vnd.google-apps.document",
};
var media = {
  mimeType: "text/plain",  // <--- Added
  body: bufferStream
};
  • En este caso, se utiliza el módulo stream.

Respuesta a la pregunta 2:

En esta respuesta, se agregan más datos de texto al documento de Google existente mediante la API de Drive.

Puntos de modificación:

  • En este caso, es necesario realizar el siguiente flujo.
    1. Recupere todos los datos de texto del documento de Google existente.
    2. Agregue más datos de texto a los textos recuperados.
    3. Actualice el documento de Google existente con los datos de texto actualizados.
      • En este caso, se utiliza el método de "Archivos: actualización" en la API de Drive.

El script de muestra es el siguiente.

Script de muestra:

const documentId = "###"; // Please set the Google Document ID of the existing Google Document.
drive.files.export(
  {
    fileId: documentId,
    mimeType: "text/plain",
  },
  { responseType: "stream" },
  (err, { data }) => {
    if (err) {
      console.log(err);
      return;
    }
    let buf = [];
    data.on("data", (e) => buf.push(e));
    data.on("end", () => {
      const stream = require("stream");

      const content = "\n" + "Added text data";  // Here, the text data is added to the existing text in Document.

      buf.push(Buffer.from(content, "binary"));
      const bufferStream = new stream.PassThrough();
      bufferStream.end(Uint8Array.from(Buffer.concat(buf)));
      var media = {
        body: bufferStream,
      };
      drive.files.update(
        {
          fileId: documentId,
          resource: {},
          media: media,
          fields: "id",
        },
        function (err, file) {
          if (err) {
            console.error(err);
            return;
          }
          console.log(file.data.id);
        }
      );
    });
  }
);
  • En esta secuencia de comandos de muestra, utilicé const content = "\n" + "Added text data"; para agregar más datos de texto. Si no desea insertar el salto de línea para esto, elimine "\n".

Nota:

  • Para agregar más datos de texto, creo que también puede usar Docs API. Pero en su objetivo, se utiliza la API de Drive. Entonces propuse el método para usar la API de Drive.

Referencias:

2
Tanaike 27 sep. 2020 a las 08:37

Del ejemplo de subidas de medios para googleapis@60.0.1, puede crear un documento de Google con un título y contenido determinados dentro de una carpeta determinada con

const drive = google.drive({ version: 'v3', auth });

const filename = '<filename>';
const parentFolderId = '<parent-folder-id>';
const content = '<file-content>';

const requestBody = {
  name: filename,
  parents: [parentFolderId],
  mimeType: 'application/vnd.google-apps.document',
};
const media = {
  mimeType: 'text/plain',
  body: content,
};

await drive.files.create({
  requestBody,
  media,
  fields: 'id',
});

Para realizar modificaciones en el documento, lo mejor es utilizar la API de Docs. Ofrece un control preciso sobre las modificaciones del documento.

Si está buscando una solución simple para actualizar el contenido de un documento de Google mediante la API de Drive , un enfoque un poco más básico para usar la API de Documentos es

drive = google.drive({ version: 'v3', auth });

const fileId = '<file-id>';
const newContent = '<new content>';
const media = {
  mimeType: 'text/plain',
  body: newContent,
};

await drive.files.update({
  fileId,
  media,
});

Para agregar texto a un documento mediante la API de Drive , puede usar algo como

const drive = google.drive({ version: 'v3', auth });

const fileId = '<file-id>';
const contentToAppend = '<new content>';

const { data: prevContent } = await drive.files.export({
  fileId,
  mimeType: 'text/plain',
});

const newContent = prevContent + contentToAppend;

const media = {
  mimeType: 'text/plain',
  body: newContent,
};

await drive.files.update({
  fileId,
  media,
});
0
aryzing 4 oct. 2020 a las 07:42