使用应用程序脚本在 Google 表格中附加 Google 驱动器中新添加的文件

问题描述 投票:0回答:1

我们正在为社区创建一个图书库,并将其显示在我们的网站上,该网站从 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 Sheets after column results

我们正在寻找一个每天在特定时间运行的 Google 应用程序脚本,当新文档添加到 Google 云端硬盘时,它应该附加文档的详细信息 - 作为 Google 表格末尾的行。不应该从头开始

google-sheets google-apps-script google-drive-shared-drive
1个回答
0
投票

仅更新新文件并假设 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.