Google apps script 如何使用Google Sheets中的Java Apps脚本将一行剪切并粘贴到另一个工作表?
我已将以下链接附加到我的谷歌电子表格 在名为“资格”的表格中,列出了员工和个人资料。当员工离开时,用户将单击“员工离开”按钮,该按钮将打开B列。其目的是用户将在员工姓名旁边添加员工离开的日期,一旦用户按下enter键,相应的行将被剪切并粘贴到标题为“资格-员工离开”的表格中B列将再次隐藏。这是我尝试归档数据的方式,并且仍然可以访问数据,以防员工返回Google apps script 如何使用Google Sheets中的Java Apps脚本将一行剪切并粘贴到另一个工作表?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我已将以下链接附加到我的谷歌电子表格 在名为“资格”的表格中,列出了员工和个人资料。当员工离开时,用户将单击“员工离开”按钮,该按钮将打开B列。其目的是用户将在员工姓名旁边添加员工离开的日期,一旦用户按下enter键,相应的行将被剪切并粘贴到标题为“资格-员工离开”的表格中B列将再次隐藏。这是我尝试归档数据的方式,并且仍然可以访问数据,以防员工返回 我已经在脚本编辑器的第194行启动了一个应用程序脚本。起初我只是想隐藏行,但当一行隐藏在谷歌表单中时,我不想要所有的小箭头。我现在正在努力处理代码
我已经在脚本编辑器的第194行启动了一个应用程序脚本。起初我只是想隐藏行,但当一行隐藏在谷歌表单中时,我不想要所有的小箭头。我现在正在努力处理代码,希望能得到一些帮助。此代码将删除带有活动单元格的行,并将其添加到末尾的新工作表中。记住用实际值替换包含的值
function remove_and_reinsert_row() {
var sheet = SpreadsheetApp.getActiveSheet();
var active_range = sheet.getActiveRange();
var last_column = sheet.getLastColumn();
var tbd_row_data = sheet.getRange(active_range.getRowIndex(), 1, 1,last_column).getValues();
sheet.deleteRow(active_range.getRowIndex());
var new_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("existing sheet name");
var last_active_row = new_sheet.getLastRow();
new_sheet.getRange(last_active_row+1, 1, 1,tbd_row_data[0].length).setValues(tbd_row_data);
}
这将使用具有活动范围的行,即当前活动的单元格,并删除该行,将其插入新的工作表中。您可以在列上使用触发器,并在有人更改列中的值时查看,还可以使用应用程序脚本触发器触发函数
要隐藏列,可以使用以下函数:
sheet.hideCoumns(colIndex);
希望这有帮助,如果我理解正确,您希望: (1) 单击按钮
Employee Left
时(在资格
中),取消隐藏B列
(2) 如果用户在列左侧日期
(在资格
中)中写入日期,则相应行中的所有数据将剪切并粘贴到资格-左侧员工
中的第一个空行,并且B列再次隐藏
我修改了您的脚本,以便它完成这些任务
首先,看起来您编写的函数EmployeeLeft
已经完成了它应该做的事情,但我对它做了一些修改。我不知道你为什么要激活然后取消隐藏C列,但不管怎样,只要适合你。这是我写的:
function EmployeeLeft() {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getActiveSheet();
var colIndex = 2;
sheet.showColumns(colIndex);
sheet.getRange("B5").activate();
}
然后是主体部分。为了完成第(2)点,我在onEdit
触发器中编写了一个函数。我知道您已经有了一个onEdit
函数,但我认为在其中集成此代码应该不会有任何问题
基本上,此函数检查编辑的单元格是否来自工作表资格
,是否来自列B
,是否来自标题行,以及编辑的值是否有效。如果满足所有这些条件,则编辑的行将从资格
中删除,并将其值复制到资格-员工左
中的第一个空行。最后,列B
再次隐藏,直到再次单击Employee Left
以下是函数:
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);
}
}
考虑到在“资格-左员工”标题下方的某些行中有一些数据。确保删除所有这些数据,以便将值复制到相应的行中
更新
在这里,我共享一份电子表格副本,并附上正确的脚本。我建议您复制完整脚本并将其粘贴到正在处理的文件中,删除所有以前的内容:
- 函数
添加在顶部,包括我编写的函数和您已经编写的函数onEdit(e)
- 关于
,我注释掉了您编写的功能,并在下面添加了我的功能。如果你喜欢你的,只需删除我的,取消你的注释员工离开的功能
我希望这对您有所帮助,请告诉我这是否对您有效。谢谢-当我在脚本编辑器中保存脚本时,我收到一条消息“非法格式的XML语法。(第220行,文件“代码”)驳回”。这一行是脚本的结束括号。这是因为您必须替换代码中的以下内容,我将它们留给您替换:1。-在新工作表中,表的起始列通常为1。2. - 使用新工作表的名称,您将在其中保存离开的员工。我更改了名称,但没有更改“开始”列-抱歉。我现在将列号更改为1,因为我希望数据从列A移到新的工作表中。它仍然不起作用。您的两张工作表(一张从中删除,另一张插入)都在同一个电子表格中,对吗?我已经编辑了代码,只需将此处的“现有图纸名称”更改为要添加行的图纸。此外,在运行该函数时,请确保要从中删除的工作表在要删除的行的其中一列上有活动单元格(工作表上的蓝色高亮显示单元格)。抱歉-仍然不起作用。是的,两张表在同一个电子表格中。我将代码中的工作表名称更改为提取数据的工作表的名称,但什么也没有发生。这很有效-谢谢,但我的其他OneEdit函数不再有效。我遗漏了什么吗?你必须在一个编辑功能中集成两个代码。只能有一个onEdit函数,否则将只运行一个。别忘了向它传递事件参数,就像‘onEdit(e)’中一样。对不起,我不知道如何执行这两个函数。我已将您的脚本添加到共享电子表格中的编辑器中。你能更正一下并指出你做了什么以便下次我知道吗?@McChief,我用包含完整代码的电子表格副本更新了我的答案。我建议您复制所有这些代码并将其粘贴到正在处理的文件的脚本中,删除所有以前的内容。我希望这最终对你有用。你应该。不管怎样,我已经允许你进入。