#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 вопроса.
- Вы хотите знать метод создания нового документа Google, включая текстовые данные.
- Вы хотите знать метод добавления дополнительных текстовых данных в существующий документ 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.
Точки изменения:
- В этом случае требуется выполнить следующий поток.
- Извлеките все текстовые данные из существующего документа Google.
- Добавьте больше текстовых данных к извлеченным текстам.
- Обновите существующий документ 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,
});