如何将上传到 google 表单的图像移动到单独的单独文件夹中?

How to move images uploaded to google form into individual seperate folder?

我有 Google 新 属性 列表的表格。

提交表单后,我想在 parent 文件夹中创建一个名为输入名称(表单输入字段 1)的文件夹,并包含该表单上传的图像(表单输入字段 3 ).如此有效,在每个表单条目上创建一个文件夹。

在 Google 表单中,使用脚本编辑器,我在下面输入了这段代码和 parent 文件夹 ID。我还为 onFormSubmit 设置了触发器。

然而,第 5 行抛出错误 TypeError: Cannot read property 'getItemResponses' of undefined

请理解,我是此类代码的初学者,所以我不确定并且有点深奥。

这个任务可行吗?

谢谢

function onFormSubmit(e) {
  const folderId = "1VXzzzzzzzzzzzzzz";  

  const form = FormApp.getActiveForm();
  const formResponses = form.getResponses();
  const itemResponses = formResponses[formResponses.length-1].getItemResponses();

  Utilities.sleep(3000); // This line might not be required.

  // Prepare the folder.
  const destFolder = DriveApp.getFolderById(folderId);
  const folderName = itemResponses[0].getResponse();
  const subFolder = destFolder.getFoldersByName(folderName);
  const folder = subFolder.hasNext() ? subFolder : destFolder.createFolder(folderName);

  // Move files to the folder.
  itemResponses[1].getResponse().forEach(id => DriveApp.getFileById(id).moveTo(folder));
}

我认为主要问题是您获得答案的方式:formResponses[formResponses.length-1].getItemResponses();

由于每个答案都在数组中占据一个位置,因此很容易跟踪它们。如果第1题占第0位,第2题占第1位,以此类推

以下示例已经过测试并有效:

function handleForms() {
  /* Initialize an empty array for save the folders  */
  let folders = []
  const form = FormApp.getActiveForm()
  for (const res of form.getResponses()) {
    /* Getting the responses in this example only are two of them */
    const folderName = res.getItemResponses()[0].getResponse()
    const imgResponse = res.getItemResponses()[1]
    /* Create a new folder with the name */
    const folder = DriveApp.createFolder(folderName)
    /* Iterate to move the files to the new folder */
    for (const img of imgResponse.getResponse()) {
      DriveApp.getFileById(img).moveTo(folder)
    }
    Logger.log(folders)
    folders.push(folder)
  }
  /* Iterate over the folders to move them to the main one */
  const mainFolder = DriveApp.getFolderById('<YOUR_FORM_FOLDER>')
  folders.forEach(f => DriveApp.getFolderById(f.getId()).moveTo(mainFolder))
}
更新

如果要保留原始文件,只需在图像迭代中添加以下两行:

const newIMG = DriveApp.getFileById(img).makeCopy()
newIMG.moveTo(folder)
更新 2

为了控制文件是否已经存在,您可以实现一个控件来检查文件夹是否存在,然后再创建它。

const checker = DriveApp
  .getFolderById(MAIN_FOLDER)
  .getFoldersByName(folderName)

if (checker.hasNext()) continue
/* Create a new folder with the name */
const folder = DriveApp.createFolder(folderName)