如何将上传到 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)
我有 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)