google-apps-script - 创建一个具有相应列名的新工作表?
问题描述
我有一张工作表,其中 B 列是员工代码我需要在看到新员工代码时创建一个新工作表,并将相应的行附加到与员工代码对应的新工作表中,并删除主工作表中的相应行。每当出现相同的员工代码时,我需要将行附加到相应的员工代码表中。例如,emp 代码 10003810 在此工作表中出现三次,第一个 10003810 我创建了一个名为 10003810 的工作表并将行附加到此工作表,每当 10003810 出现时,我将相应的附加到工作表 10003810。我尝试的代码是
function sheetCreate(){
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = activeSpreadsheet.getSheetByName("Form Responses 1")
var getNames = sheet1.getRange("B2:B").getValues();
var erg = sheet1.getDataRange();
var evA=erg.getValues();
var d=0;
for (var i =1;i<=getNames.length; i++) {
var copy = getNames[i];
var newSheet = activeSpreadsheet.insertSheet();
newSheet.setName(copy);
newSheet.appendRow(copy);
sheet1.deleteRow(i+1-d);
d++;
}
}
解决方案
我相信你的目标如下。
- 您想使用工作表“Form Responses 1”的“B”列。
- 当电子表格的工作表名称中不存在列“B”的值时,您希望插入具有该值名称的新工作表。
- 当电子表格的工作表名称中存在“B”列的值时,您希望将该值附加到与该值相同的工作表名称。
- 在上述过程完成后,您想删除工作表“Form Responses 1”中的所有行。
修改点:
- 在您的脚本中,将为所有值创建新工作表。而当值为空时,就会发生错误。
- 我认为在您的情况下,使用
clearContent()
和/或clear()
代替如何deleteRow
?- 关于这一点,我想提出2种修改模式。
修改脚本1:
在此修改中,行将像您的脚本一样被删除。
function sheetCreate(){
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = activeSpreadsheet.getSheetByName("Form Responses 1");
var [, ...getNames] = sheet1.getDataRange().getValues(); // <--- Modified
var erg = sheet1.getDataRange();
var evA=erg.getValues();
// And, I modified below script.
// 1. Create an object including the sheet name and sheet object.
var sheetsObj = activeSpreadsheet.getSheets().reduce((o, e) => Object.assign(o, {[e.getSheetName()]: e}), {});
// 2. Insert new sheet and copy the values to the sheet, and return the last row of the column "B".
// <--- Modified
var deleteRows = getNames.reduce((ar, r, i) => {
if (r[1].toString() != "") {
if (r[1] in sheetsObj) {
sheetsObj[r[1]].appendRow(r);
} else {
var newSheet = activeSpreadsheet.insertSheet(r[1].toString());
newSheet.appendRow(r);
sheetsObj[r[1]] = newSheet;
}
ar.push(i + 2);
}
return ar;
}, []).pop();
// 3. Delete rows.
sheet1.deleteRows(2, deleteRows - 1);
}
修改脚本2:
在此修改中,行被清除。在这种情况下,请按如下方式修改上述脚本。
从:sheet1.deleteRows(2, deleteRows - 1);
到:
sheet1.getRange(2, 1, deleteRows - 1, sheet1.getLastColumn()).clearContent(); // Or clear()
参考:
添加:
根据您的要求if possible can you help me out this code with if or loop conditions
,我将上面的脚本修改如下。两个脚本的脚本结果相同。
修改后的脚本:
function sheetCreate2(){
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = activeSpreadsheet.getSheetByName("Form Responses 1");
var getNames = sheet1.getDataRange().getValues();
getNames.shift();
var erg = sheet1.getDataRange();
var evA=erg.getValues();
var sheets = activeSpreadsheet.getSheets();
var sheetsObj = {};
for (var i = 0; i < sheets.length; i++) {
sheetsObj[sheets[i].getSheetName()] = sheets[i];
}
var deleteRows = 0;
for (var i = 0; i < getNames.length; i++) {
var r = getNames[i];
if (r[1].toString() != "") {
if (r[1] in sheetsObj) {
sheetsObj[r[1]].appendRow(r);
} else {
var newSheet = activeSpreadsheet.insertSheet(r[1].toString());
newSheet.appendRow(r);
sheetsObj[r[1]] = newSheet;
}
deleteRows = i + 2;
}
}
sheet1.deleteRows(2, deleteRows - 1);
}
推荐阅读
- java - 如何放心发送-d信息?
- excel - VBA 解析 XML api URL
- vuetify.js - 如何更改 Vuetify 日期范围选择器的外观?
- c# - 如何在 LINQ 子问题中使用表达式
- android - Youtube Data API Activities.list 端点的 home 参数是否有任何替代方法?
- javascript - 来自 readDocument 的文档大小的 CosmosDB 存储过程启发式
- stored-procedures - 使用存储过程但不返回表数据在 EF Core 中获取输出参数值
- c++ - 包括两个不能同时使用的标头
- arrays - TypeError:无法读取反应js中未定义的属性“名称”
- android - Android图形在不同的api上绘制错误的视角