google-apps-script - 在使用具有剪切和粘贴功能的 Apps 脚本时,如何处理来自 Google 表单的新数据?
问题描述
我在以下链接中的 Google 表格中有一个员工培训数据库:
Google 表单使用员工信息填充“添加员工表单响应”表的 A 到 J 列。该数据通过简单的 =cell 函数传输到“资格”表。问题是,我不知道为什么,当每个新表格完成并且表格答案填充“添加员工表格响应”表时,它会将“资格”表中下一个空行中的单元格编号更改为接下来的行号链接到“添加员工表单响应”表中的空白单元格。例如,在表格完成之前,资格表第 4 行中的所有单元格都是从“添加员工表格响应”表的第 4 行绘制的,但在填充表格之后,资格表的第 4 行是从第 5 行绘制的“添加员工表单回复”
我曾经在两张工作表之间有另一张带有查询功能的工作表,效果很好,但后来我添加了以下应用程序脚本(脚本编辑器的第 1 到 24 行)以在 B 列中输入日期时剪切行“资格”表并将其粘贴到“资格 - 剩余员工”表中。问题在于查询只是从“添加员工表单响应”表中再次检索数据并重新填充“资格”表。换句话说,刚刚从“资格”表剪切并粘贴到“资格-剩余员工”表中的数据通过查询从“添加员工表单响应”表返回到“资格”表。
// Cut Employees Left from Qualifications sheet and
// paste in Qualifications - Employees Left sheet
function onEdit(e) {
var ss = e.source;
var sheet = ss.getActiveSheet();
var sheetName = "Qualifications"
var range = e.range;
var editedColumn = range.getColumn();
var editedRow = range.getRow();
var column = 2;
var date = range.getValue();
// Object.prototype.toString.call(date) === '[object Date]' --> checks if value is date
// editedColumn == column && editedRow > 4 --> checks if edited cell is from 'Date Left'
// sheet.getName() == sheetName --> checks if edited sheet is 'Qualifications'
if(Object.prototype.toString.call(date) === '[object Date]' && editedColumn == column && editedRow > 4 && sheet.getName() == sheetName) {
var numCols = sheet.getLastColumn();
var row = sheet.getRange(editedRow, 1, 1, numCols).getValues();
var destinationSheet = ss.getSheetByName("Qualifications - Employees Left");
// Get first empty row:
var emptyRow = destinationSheet.getLastRow() + 1;
// Copy values from 'Qualifications'
destinationSheet.getRange(emptyRow, 1, 1, numCols).setValues(row);
sheet.deleteRow(editedRow);
sheet.hideColumns(column);
}
如果“资格”表和“添加员工表单响应”表之间的行编号问题有一个简单的修复,我会很高兴。否则,我认为可以解决此问题的唯一方法是恢复查询功能,然后获取应用程序脚本以从“添加员工表单响应”表中删除数据。我将不胜感激任何建议。我真的希望一切都自动化,因为会有很多计算机文盲用户。
解决方案
您正在寻找一种更好的方法来动态记录新员工,并在您的“资格”表上的“添加员工表单响应”表上得到通知。目前您使用简单的公式,但这些公式不一定会自动挑选新员工。
在这个答案中,我建议您查看“资格”数据从表单响应表物理复制到“资格”表的场景。
出于开发目的,进行了以下步骤:
- 创建了“资格”表的副本
- 将重复的工作表命名为“员工”。
- 在“员工”上显示所有行
- 将一名现有员工复制(复制/粘贴值)到第 5 行
- 从第 6 行到最后一行删除所有单元格的内容 - 到最后一列
- 将脚本复制到绑定的项目中
- 将该功能安装为可安装触发器 - 事件 = 电子表格/表单提交
- 处理了一些新员工进行测试。
- 确认新员工数据添加到最后一行加上一个“员工”
function so5882862602(e) {
//58828626
// setup spreadsheet and sheets
var ss = SpreadsheetApp.getActiveSpreadsheet();
var formsheetname = "Add Employee Form Responses";
var form = ss.getSheetByName(formsheetname);
var staffsheetname = "staff";
var staff = ss.getSheetByName(staffsheetname);
// get Form Response
//Logger.log(JSON.stringify(e));
var row = e.range.getRow();
var range = form.getRange(row,1,1,10);
//Logger.log("DEBUG: The range is "+range.getA1Notation());
var values = range.getValues();
var formSurname = values[0][1]
var formFirstName = values[0][2];
var formaka = values[0][3];
var formType = values[0][4]
var formBranch = values[0][5];
var formDOB = values[0][6];
var formGender = values[0][7]
var formNSN = values[0][8];
var formNZQA = values[0][9];
//var formTimeStamp = values[0][0];
Logger.log("DEBUG: Employee="+formSurname+", "+formFirstName+",aka="+formaka+", Type="+formType+", Branch="+formBranch+", DOB="+formDOB+", Gender="+formGender+", NSN="+formNSN+", NZQA="+formNZQA);
//update the staff sheet
var staffupdate = [];
var staffinal=[];
// check the value of formaka and adjust name accordingly
var staffname = "";
// check the value of formaka
if (formaka != ""){
staffname = formSurname.toUpperCase()+", "+formFirstName+" ("+formaka+")";// name
}
else{
staffname = formSurname.toUpperCase()+", "+formFirstName;// name
}
// push the values to a blank array
staffupdate.push(staffname); // name
staffupdate.push(""); // left
staffupdate.push(formType);// TYPE
staffupdate.push(formBranch); // branch
staffupdate.push(formDOB); // DOB
staffupdate.push(formGender);// Gender
staffupdate.push(formNSN);// National Student Number
staffupdate.push(formNZQA); // NZQA Unit Standards
//push the array to a second array to create 2D
staffinal.push(staffupdate);
// get staff data
var staffLR = staff.getLastRow();
var staffupdaterange = staff.getRange(staffLR+1,1,1,8);
Logger.log("DEBUG: The staff range = "+staffupdaterange.getA1Notation());
// update the form values to the staff sheet
staffupdaterange.setValues(staffinal);
}
推荐阅读
- sql - 执行 sp_configure 'max server memory' 时出错
- docker - 在 Docker 上运行 Mysql 和 Wordpress,得到消息 Error建立数据库连接
- javascript - 如何在 vue 测试中更改 vuex getter 值?
- postfix-mta - 后缀 rbl 检查
- c# - Azure Function 输出与 Azure.Cosmos.Table 的绑定
- r - 将长度不等的多级嵌套列表转换为数据帧
- firebase - 当我单击“创建帐户”时,什么也没有发生。在调试控制台 viewposttime 指针上点击
- java - Spring Security 自定义登录页面不起作用
- javascript - 在“npm i”之后的几个地方更新 package.json
- javascript - 带有点击事件的完整日历事件资源