Drive API — обновление / создание документа Google из строки — Node.js

#node.js #google-drive-api #google-docs #google-docs-api

#node.js #google-drive-api #google-docs #google-docs-api

Вопрос:

Я использую Drive API v3 (Node.js ), чтобы создать Google Doc с некоторыми данными. Позже я также хочу иметь возможность «добавлять» новые данные в существующий документ Google.

Я написал следующий код для создания нового документа Google в определенной папке:

           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);
          })
  

Мой вопрос в том, как я могу создать документ и инициализировать его с помощью строки? Я хочу, чтобы он был доступен для чтения на диске. Прямо сейчас создается двоичный файл с «Недоступным предварительным просмотром».

Кроме того, я хочу иметь функцию для обновления этого документа (добавления) с помощью строки. Вот так:

          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'
          })
  

Любая помощь будет с благодарностью! Спасибо!

Ответ №1:

Я считаю, что ваша цель заключается в следующем.

  • В вашем вопросе есть следующие 2 вопроса.
    1. Вы хотите знать метод создания нового документа Google, включая текстовые данные.
    2. Вы хотите знать метод добавления дополнительных текстовых данных в существующий документ Google.
  • Вы хотите достичь этого с помощью Drive API с googleapis для Node.js .
  • Вы уже смогли получить и поместить файл с помощью Drive API.

Ответ на вопрос 1:

В этом ответе новый документ Google создается путем включения текстовых данных с использованием Drive API.

Точки изменения:

  • В этом случае требуется преобразовать текст в тип stream .
  • Когда текст преобразуется в документ Google, mimeType он должен быть включен fileMetadata .

Когда вышеуказанные пункты будут отражены в вашем скрипте, это будет выглядеть следующим образом.

Модифицированный скрипт:

От:

 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
};
  
  • В этом случае stream используется module .

Ответ на вопрос 2:

В этом ответе дополнительные текстовые данные добавляются в существующий документ Google с помощью Drive API.

Точки изменения:

  • В этом случае требуется выполнить следующий поток.
    1. Извлеките все текстовые данные из существующего документа Google.
    2. Добавьте больше текстовых данных к извлеченным текстам.
    3. Обновите существующий документ Google, используя обновленные текстовые данные.
      • В этом случае используется метод «Files: update» в Drive API.

Пример сценария выглядит следующим образом.

Пример сценария:

 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);
        }
      );
    });
  }
);
  
  • В этом примере сценария я использовал const content = "n" "Added text data"; для добавления дополнительных текстовых данных. Если вы не хотите вставлять для этого разрыв строки, пожалуйста, удалите "n" .

Примечание:

  • Я думаю, что вы также можете использовать Docs API, чтобы добавить больше текстовых данных. Но в вашей цели используется Drive API. Итак, я предложил метод использования Drive API.

Ссылки:

Комментарии:

1. Ответ на 2-й вопрос работает отлично, но для 1-го вопроса мой файл успешно создается (файл Google doc), но данные не заполняются. Он пуст.

2. @anomaly Спасибо за ответ. Приношу извинения за неудобства. Хотя я не уверен, что это прямое решение, я обновил сценарий шаблона 1. Я включил mimeType media . Не могли бы вы подтвердить это? В моей среде я мог бы подтвердить, что скрипт сработал. Если это не решило вашу проблему, я снова приношу извинения.

3. Спасибо @Tanaike, но он все тот же. Пустой документ. Просто для подтверждения, для создания документа я использую multipart: media , а не media: media . Я не могу использовать простую загрузку и должен использовать многостраничную загрузку из-за нерешенной проблемы с electron (в случае создания). В случае обновления я использую media: media то, что работает хорошо.

4. Альтернативный вариант, если это не сработает, — просто создать пустой документ, а затем обновить его текстом в 2 отдельных запросах.

5. @anomaly Спасибо за ответ. Я снова приношу извинения за неудобства. К сожалению, я не могу повторить вашу ситуацию. Но я заметил, что multipart: media это используется в запросе. Хотя в моей среде скрипт работает с и без multipart: media , можете ли вы удалить его и протестировать снова? А также, какую версию googleapis вы используете? На текущем этапе это googleapis@60.0.1 . Если вы используете более старую версию, пожалуйста, обновите ее и протестируйте еще раз. Если это не было прямым решением, пожалуйста, используйте шаблон 2 в качестве обходного пути вашего ответа.

Ответ №2:

Из примера загрузки мультимедиа для googleapis@60.0.1 вы можете создать документ Google с заданным заголовком и содержимым внутри заданной папки с помощью

 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',
});
  

Для внесения изменений в документ лучше всего использовать Docs API. Он обеспечивает точный контроль над изменениями документа.

Если вы ищете простое решение для обновления содержимого документа Google с помощью Drive API, немного более грубый подход к использованию Docs API

 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,
});
  

Для добавления текста в документ с помощью Drive API вы можете использовать что-то вроде

 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,
});