使用 GAS 操作 RTF 文件(到 gdoc,集体)
Manipulating RTF files with GAS (to gdoc, en masse)
有没有办法以编程方式将 RTF 文件转换为 gdoc,或者如果您无法转换,则只需复制内容?我有数百个存储在 gdrive 中,所以我更愿意转换它们,以便以后更容易操作和合并。
- 您想将 RTF 文件转换为 Google 文档。
- 有数百个 RTF 文件。
如果我的理解是正确的,这个示例脚本怎么样?
作为简单的转换,您可以使用 Drive.Files.copy({mimeType: MimeType.GOOGLE_DOCS}, fileId)
使用高级 Google 服务的脚本。但是从你的问题来看,我认为当转换很多文件时,执行时间可能会超过6分钟。因此,在此示例脚本中,我使用批处理请求将文件与 Drive API 的 files.copy 方法进行转换。
示例脚本:
当您运行脚本时,请将参数设置为main()
的函数。和 运行 main()
.
// Get file IDs of Microsoft Excel files in a specific folder including subfolders.
function getFileIds(folder, fileIds, q) {
var files = folder.searchFiles(q);
while (files.hasNext()) {
fileIds.push(files.next().getId());
}
var folders = folder.getFolders();
while (folders.hasNext()) {
getFileIds(folders.next(), fileIds, q);
}
return fileIds;
}
// Convert Microsoft Docs to Google Docs
function convertToGoogleDocs(fileIds, dest, to) {
var limit = 100;
var split = Math.ceil(fileIds.length / limit);
var reqs = [];
for (var i = 0; i < split; i++) {
var boundary = "xxxxxxxxxx";
var payload = fileIds.splice(0, limit).reduce(function(s, e, i) {
s += "Content-Type: application/http\r\n" +
"Content-ID: " + i + "\r\n\r\n" +
"POST https://www.googleapis.com/drive/v3/files/" + e + "/copy" + "\r\n" +
"Content-Type: application/json; charset=utf-8\r\n\r\n" +
JSON.stringify({"parents": [dest], "mimeType": to}) + "\r\n" +
"--" + boundary + "\r\n";
return s;
}, "--" + boundary + "\r\n");
var params = {
method: "post",
contentType: "multipart/mixed; boundary=" + boundary,
payload: payload,
headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
muteHttpExceptions: true,
};
var req = UrlFetchApp.getRequest("https://www.googleapis.com/batch/drive/v3", params);
reqs.push(req);
}
return UrlFetchApp.fetchAll(reqs);
}
// Please run this function.
function main() {
var sourceFolderId = "###"; // Folder ID including source files. Please set this.
var destinationFolderId = "###"; // Folder ID that the converted files are put. Please set this.
var from = [MimeType.RTF, MimeType.MICROSOFT_WORD_LEGACY]; // Source mimeType
var to = MimeType.GOOGLE_DOCS; // Destination mimeType
var q = from.reduce(function(q, e, i) {return q += "mimeType='" + e + "'" + (i < from.length - 1 ? " or " : "")}, "");
var fileIds = getFileIds(DriveApp.getFolderById(sourceFolderId), [], q);
Logger.log(fileIds)
var res = convertToGoogleDocs(fileIds, destinationFolderId, to);
Logger.log(res);
}
注:
- 如果文件较大,可能会出错。
- 当 Drive API 检索 RTF 文件时,mimeType 会变为
application/msword
。所以我搜索了 application/rtf
和 application/msword
.
- 很遗憾,在当前阶段,批量请求无法使用媒体 blob。所以我使用了 files.copy 方法。在这种情况下,可以在不使用媒体 blob 的情况下转换文件。
参考文献:
如果我误解了你的问题,这不是你想要的结果,我深表歉意。
有没有办法以编程方式将 RTF 文件转换为 gdoc,或者如果您无法转换,则只需复制内容?我有数百个存储在 gdrive 中,所以我更愿意转换它们,以便以后更容易操作和合并。
- 您想将 RTF 文件转换为 Google 文档。
- 有数百个 RTF 文件。
如果我的理解是正确的,这个示例脚本怎么样?
作为简单的转换,您可以使用 Drive.Files.copy({mimeType: MimeType.GOOGLE_DOCS}, fileId)
使用高级 Google 服务的脚本。但是从你的问题来看,我认为当转换很多文件时,执行时间可能会超过6分钟。因此,在此示例脚本中,我使用批处理请求将文件与 Drive API 的 files.copy 方法进行转换。
示例脚本:
当您运行脚本时,请将参数设置为main()
的函数。和 运行 main()
.
// Get file IDs of Microsoft Excel files in a specific folder including subfolders.
function getFileIds(folder, fileIds, q) {
var files = folder.searchFiles(q);
while (files.hasNext()) {
fileIds.push(files.next().getId());
}
var folders = folder.getFolders();
while (folders.hasNext()) {
getFileIds(folders.next(), fileIds, q);
}
return fileIds;
}
// Convert Microsoft Docs to Google Docs
function convertToGoogleDocs(fileIds, dest, to) {
var limit = 100;
var split = Math.ceil(fileIds.length / limit);
var reqs = [];
for (var i = 0; i < split; i++) {
var boundary = "xxxxxxxxxx";
var payload = fileIds.splice(0, limit).reduce(function(s, e, i) {
s += "Content-Type: application/http\r\n" +
"Content-ID: " + i + "\r\n\r\n" +
"POST https://www.googleapis.com/drive/v3/files/" + e + "/copy" + "\r\n" +
"Content-Type: application/json; charset=utf-8\r\n\r\n" +
JSON.stringify({"parents": [dest], "mimeType": to}) + "\r\n" +
"--" + boundary + "\r\n";
return s;
}, "--" + boundary + "\r\n");
var params = {
method: "post",
contentType: "multipart/mixed; boundary=" + boundary,
payload: payload,
headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
muteHttpExceptions: true,
};
var req = UrlFetchApp.getRequest("https://www.googleapis.com/batch/drive/v3", params);
reqs.push(req);
}
return UrlFetchApp.fetchAll(reqs);
}
// Please run this function.
function main() {
var sourceFolderId = "###"; // Folder ID including source files. Please set this.
var destinationFolderId = "###"; // Folder ID that the converted files are put. Please set this.
var from = [MimeType.RTF, MimeType.MICROSOFT_WORD_LEGACY]; // Source mimeType
var to = MimeType.GOOGLE_DOCS; // Destination mimeType
var q = from.reduce(function(q, e, i) {return q += "mimeType='" + e + "'" + (i < from.length - 1 ? " or " : "")}, "");
var fileIds = getFileIds(DriveApp.getFolderById(sourceFolderId), [], q);
Logger.log(fileIds)
var res = convertToGoogleDocs(fileIds, destinationFolderId, to);
Logger.log(res);
}
注:
- 如果文件较大,可能会出错。
- 当 Drive API 检索 RTF 文件时,mimeType 会变为
application/msword
。所以我搜索了application/rtf
和application/msword
. - 很遗憾,在当前阶段,批量请求无法使用媒体 blob。所以我使用了 files.copy 方法。在这种情况下,可以在不使用媒体 blob 的情况下转换文件。
参考文献:
如果我误解了你的问题,这不是你想要的结果,我深表歉意。