【发布时间】:2019-04-01 10:55:23
【问题描述】:
提供的代码将文件从 Excel 转换为 Google 表格。 The code from here 但它不会覆盖/替换目标文件夹中当前现有的电子表格文件。 是否可以完全转换包括子文件夹内的所有内容并替换任何现有的同名 Google 电子表格文件?
function convertCollection1()
{
var user = Session.getActiveUser(); // Used for ownership testing.1aJcbdGhwliTs_CZ-3ZUvQmGRDzBM7fv9
var origin = DriveApp.getFolderById("1dPsDfoqMQLCokZK4RN0C0VRzaRATr9AN");
var dest = DriveApp.getFolderById("1M6lDfc_xEkR4w61pUOG4P5AXmSGF1hGy");
// Index the filenames of owned Google Sheets files as object keys (which are hashed).
// This avoids needing to search and do multiple string comparisons.
// It takes around 100-200 ms per iteration to advance the iterator, check if the file
// should be cached, and insert the key-value pair. Depending on the magnitude of
// the task, this may need to be done separately, and loaded from a storage device instead.
// Note that there are quota limits on queries per second - 1000 per 100 sec:
// If the sequence is too large and the loop too fast, Utilities.sleep() usage will be needed.
var gsi = dest.getFilesByType(MimeType.GOOGLE_SHEETS), gsNames = {};
while (gsi.hasNext())
{
var file = gsi.next();
if(file.getOwner().getEmail() == user.getEmail())
gsNames[file.getName()] = true;
Logger.log(JSON.stringify(gsNames))
}
// Find and convert any unconverted .xls, .xlsx files in the given directories.
var exceltypes = [MimeType.MICROSOFT_EXCEL, MimeType.MICROSOFT_EXCEL_LEGACY];
for(var mt = 0; mt < exceltypes.length; ++mt)
{
var efi = origin.getFilesByType(exceltypes[mt]);
while (efi.hasNext())
{
var file = efi.next();
// Perform conversions only for owned files that don't have owned gs equivalents.
// If an excel file does not have gs file with the same name, gsNames[ ... ] will be undefined, and !undefined -> true
// If an excel file does have a gs file with the same name, gsNames[ ... ] will be true, and !true -> false
if(file.getOwner().getEmail() == user.getEmail() && !gsNames[file.getName().replace(/\.[^/.]+$/, "")])
{
Drive.Files.insert (
{title: file.getName(), parents: [{"id": dest.getId()}]},
file.getBlob(),
{convert: true}
);
// Do not convert any more spreadsheets with this same name.
gsNames[file.getName()] = true;
}
}
}
Logger.log(JSON.stringify(gsNames))
}
【问题讨论】:
-
一次只能转换一个文件,我不确定批处理是否可以隐藏。无论哪种方式,您都必须循环浏览您的文件夹。
-
我对其他帖子做了一些研究,也许可以使用 DriveApp.searchFiles 完成
-
搜索文件不会隐藏文件。它只是返回它们的列表。
-
不好意思,正在考虑怎么转换这个...
-
最简单的更改是从其他函数传入所需的“原始”文件夹 ID 和目标文件夹 ID。这是基本的重构。一个更困难但获得巨大回报的更改是在调用之间记住检索到的 Google 表格文件(因为提供源 ID 的函数可能具有多个具有相同所需目的地的 ID,并且重新计算它们是浪费的)。
标签: javascript excel google-apps-script google-drive-api