【问题标题】:Drive API - Update/Create Google Doc from a string - Node.jsDrive API - 从字符串更新/创建 Google Doc - Node.js
【发布时间】:2020-09-26 20:34:39
【问题描述】:

我正在使用 Drive API v3 (Node.js) 来创建包含一些数据的 Google Doc。稍后,我还希望有可能将新数据“附加”到现有的 Google Doc 中。

我已经编写了以下代码来在某个文件夹中创建一个新的 Google Doc:

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

我的问题是,如何创建 Doc,并使用字符串对其进行初始化?我希望它在云端硬盘上可读。现在,正在创建一个二进制文件,显示“没有可用的预览”。

另外,我想要一个函数来用一个字符串更新这个文档(追加)。像这样:

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

任何帮助将不胜感激!谢谢!

【问题讨论】:

    标签: node.js google-drive-api google-docs google-docs-api


    【解决方案1】:

    我相信你的目标如下。

    • 您的问题包含以下 2 个问题。
      1. 您想知道创建包含文本数据的新 Google 文档的方法。
      2. 您想知道向现有 Google 文档添加更多文本数据的方法。
    • 您希望使用 Drive API 和 googleapis for Node.js 来实现此目的。
    • 您已经能够使用 Drive API 获取和放置文件。

    问题一的答案:

    在此答案中,通过使用 Drive API 包含文本数据来创建新的 Google 文档。

    修改点:

    • 在这种情况下,需要将文本转换为流类型。
    • 将文本转换为 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 模块。

    问题2的答案:

    在此答案中,使用 Drive API 将更多文本数据添加到现有 Google 文档中。

    修改点:

    • 在这种情况下,需要执行以下流程。
      1. 从现有的 Google 文档中检索所有文本数据。
      2. 为检索到的文本添加更多文本数据。
      3. 使用更新的文本数据更新现有的 Google 文档。
        • 在这种情况下,使用 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的使用方法。

    参考资料:

    【讨论】:

    • 第二个问题的答案完美无缺,但对于第一个问题,我的文件已成功创建(Google 文档文件),但没有填充数据。它是空的。
    • @anomaly 感谢您的回复。我带来的不便表示歉意。虽然我不确定这是直接的解决方案,但我更新了模式 1 的脚本。我将 mimeType 包含在 media 中。你能确认一下吗?在我的环境中,我可以确认脚本有效。如果这不能解决您的问题,我再次道歉。
    • 感谢@Tanaike,但还是一样。一个空文档。只是为了确认,为了创建文档,我使用的是 multipart: media 而不是 media: media。由于电子的未决问题(在创建的情况下),我不能使用简单上传,并且必须使用分段上传。在更新的情况下,我使用media: media,效果很好。
    • 如果这不起作用,另一种选择是,只需创建一个空文档,然后在 2 个单独的请求中用文本更新它。
    • @anomaly 感谢您的回复。再次为给您带来的不便深表歉意。不幸的是,我无法复制您的情况。但我注意到请求中使用了multipart: media。虽然在我的环境中,脚本在有和没有multipart: media 的情况下都可以工作,你可以删除它并再次测试它吗?另外,您使用的是哪个版本的 googleapis?在当前阶段,它是googleapis@60.0.1。如果您使用的是旧版本,请更新并再次测试。如果这不是直接的解决方案,请使用模式 2 作为回复的解决方法。
    【解决方案2】:

    Media Uploads examplegoogleapis@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。它提供对文档修改的精细控制。

    如果您正在寻找一种使用 Drive API 更新 Google 文档内容的简单解决方案,使用 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,
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多