-2

我想根据表单响应将文件从 Google 表单上传到特定文件夹。基于此链接

但是,问题是当同一个用户多次上传时,第一次之后的任何文件上传都会自动将文件发送回原始根文件夹。

我想要的是允许同一用户多次上传并将同一用户上传的文件发送到他已经创建的子文件夹(他的名字)。

我怎么做?

[用我使用的代码编辑]抱歉。我从这个网站复制了代码,https://www.labnol.org/file-uploads-folder-google-forms-201226,它可以工作,但它每次都会重新创建一个带有文件 ID 的子文件夹。

[其他编辑和信息] 我想多次澄清我的意思。这意味着该人将多次提交表单响应,但一次只能上传 1 个文件。

4

1 回答 1

0

据我了解,您的目标是:

  • 使用表单答案(名称)创建文件夹
  • 使用文件夹名称检查文件夹是否存在。
    • 如果是,请将附件移至现有文件夹
    • 如果没有,请创建新文件夹并移动附件。

在这里,我复制了您提供的代码并添加了 Allan Wells的答案以检查文件夹是否存在。

例子:

代码:

const PARENT_FOLDER_ID = "Parent folder ID here";

const initialize = () => {
  const form = FormApp.getActiveForm();
  ScriptApp.newTrigger("onFormSubmit").forForm(form).onFormSubmit().create();
};

const onFormSubmit = ({ response } = {}) => {
  try {
    // Get a list of all files uploaded with the response
    const files = response
      .getItemResponses()
      // We are only interested in File Upload type of questions
      .filter(
        (itemResponse) =>
          itemResponse.getItem().getType().toString() === "FILE_UPLOAD"
      )
      .map((itemResponse) => itemResponse.getResponse())
      // The response includes the file ids in an array that we can flatten
      .reduce((a, b) => [...a, ...b], []);

    if (files.length > 0) {
      //get the first response (which is Name) and use it as subfolder name
      const subfolderName = response.getItemResponses()[0].getResponse();
      //check if the subfolder name already exists
      var folderId = folderExists(subfolderName);
      var subfolder;
      
      if(folderId){ //if subfolder name already exists, use the folder ID to get the folder object
        subfolder = DriveApp.getFolderById(folderId);
      }else{ //create new folder
        const parentFolder = DriveApp.getFolderById(PARENT_FOLDER_ID);
        subfolder = parentFolder.createFolder(subfolderName);
      }
      files.forEach((fileId) => {
        // Move each file into the custom folder
        DriveApp.getFileById(fileId).moveTo(subfolder);
      });
    }
  } catch (f) {
    Logger.log(f);
  }
};


function folderExists(fname) { //Check whether folder exists or not
  var folders = DriveApp.getFolderById(PARENT_FOLDER_ID).getFolders();
  var theReturn = false,
      i=0,
      folderName = "",
      folder;  
  while (folders.hasNext()) {
    folder = folders.next();
    folderName = folder.getName();
    if (folderName.toLowerCase() == fname.toLowerCase()) {
      theReturn = folder.getId();
      break;
    };
  };
  return theReturn;
};

样品表格:

在此处输入图像描述

样本输出:

在这里,我为“测试名称”提交了多个表格

在此处输入图像描述

参考:

于 2021-04-07T19:52:20.240 回答