我们正在为社区创建一个图书库,并将其显示在我们的网站上,该网站从 Google Sheets 获取数据。
书籍存储在 Google Drive 中。
我们所做的:我们使用了网上可用的 Google 应用程序脚本,该脚本将驱动器中可用的所有文档写入 Google 表格。该脚本可以在下面找到。
当前问题:我们必须手动运行脚本,一旦运行,它就会从头开始,当它达到大约 800 个文档时,它就会停止,并显示消息“超出时间限制”
我们正在寻找一个每天在特定时间(例如晚上 9 点)运行的 Google 应用程序脚本,当新文档添加到我们的驱动器时,它应该仅使用该文档更新 Google 表格。(不应从头开始)
Stack Overflow 上有一些相关链接,但我们正在寻找统一的解决方案
Google Apps 脚本触发器 - 每当将新文件添加到文件夹时运行
当前给出结果的工作代码。
function onOpen() {
var SS = SpreadsheetApp.getActiveSpreadsheet();
var ui = SpreadsheetApp.getUi();
ui.createMenu('List Files/Folders')
.addItem('List All Files and Folders', 'getListFilesandFolders')
.addToUi();
};
function getListFilesandFolders(){
var folderId = Browser.inputBox('Enter folder ID', Browser.Buttons.OK_CANCEL);
if (folderId === "") {
Browser.msgBox('Folder ID is invalid');
return;
}
makeListFilesAndFolders(folderId, true);
};
function makeListFilesAndFolders(folderId, listAll) {
const sh = SpreadsheetApp.getActiveSheet();
const range = sh.getRange('A2:H')
range.clear();
sh.appendRow(["parent","folder", "name", "date created", "URL","MimeType"]);
try {
var parentFolder =DriveApp.getFolderById(folderId);
listFiles(parentFolder,parentFolder.getName())
listSubFolders(parentFolder,parentFolder.getName());
} catch (e) {
Logger.log(e.toString());
}
};
function listSubFolders(parentFolder,parent) {
var childFolders = parentFolder.getFolders();
while (childFolders.hasNext()) {
var childFolder = childFolders.next();
Logger.log("Fold : " + childFolder.getName());
listFiles(childFolder,parent)
listSubFolders(childFolder,parent + "|" + childFolder.getName());
}
};
function listFiles(fold,parent){
var sh = SpreadsheetApp.getActiveSheet();
var data = [];
var files = fold.getFiles();
while (files.hasNext()) {
var file = files.next();
data = [
parent,
fold.getName(),
file.getName(),
file.getDateCreated(),
//file.getLastUpdated(),
file.getUrl(),
//file.getId(),
//file.getSize(),
//file.getDescription(),
file.getMimeType()
];
sh.appendRow(data);
}
}
我们正在寻找一个每天在特定时间运行的 Google 应用程序脚本,当新文档添加到 Google 云端硬盘时,它应该附加文档的详细信息 - 作为 Google 表格末尾的行。不应该从头开始
仅更新新文件并假设 id 存储在 A 列中
function getNewFileIds() {
PropertiesService.getScriptProperties().setProperty("newids", "[]");
var initfldrId;
getFilesIds(DriveApp.getFolderById(initfldrId));
return JSON.parse(PropertiesService.getScriptProperties().getProperty("newids"))
}
function getFileIds(fldr) {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("SheetName");
const curids = sh.getRange(2, 1, sh.getLastRow() - 1).getValues().flat();
var newids = JSON.parse(PropertiesService.getScriptProperties().getProperty("newids"));
let files = fldr.getFiles();
while (files.hasNext()) {
let f = files.next();
let id = f.getId();
if (!~curids.indexOf(id)) {
newids.push(id)
PropertiesService.getScriptProperties().setProperty("newids", JSON.stringify(newids));
}
}
let fldrs = fldr.getFolders();
while (fldrs.hasNext()) {
let fdr = fldrs.next();
PropertiesService.getScriptProperties().setProperty("newids", JSON.stringify(newids));
getFileIds(fdr);
}
}
function addFiles(newids) {
var sh = SpreadsheetApp.getActiveSheet();
var data = [];
var idA = newids;
idA.forEach(id => {
let f = DriveApp.getFileById(id)
data.push([f.getParents[0], f.getName(), f.getDateCreated(), f.getUrl(), f.getMimeType()])
})
sh.getRange(sh.getLastRow() + 1, 1, data.length,data[0].length).setValues(data);
}