提前感谢您的帮助。
我遇到一个问题,即在Google Spreadsheet中动态字段旁边修改了静态字段。问题是有时带有动态数据的列会发生变化,而静态字段将不再适用于它们。
除了脚本外,我想不出一种处理方法,但是我的脚本知识充其量是有限的。
这个想法是要有一个使用= importrange()的工作表来容纳动态数据。然后,第二张工作表将具有静态数据,该数据将根据行是否与动态工作表匹配来添加或删除行。
例如:
动态工作表将被称为“源”,在第一列中,我们将使用以下名称:Peter,Brian,Louis,Chris,Stewie
静态工作表将称为“目标”,在第一列中,我们将使用以下名称:Peter,Brian,Louis,Chris,Meg
该想法是删除第一列中包含“ Meg”的行,然后插入“ Stewie”值(或在范围底部添加一行)。 最终目标是通过编程使静态列表与动态列表匹配。
答案 0 :(得分:0)
将我认为应该进行的过程拼凑在一起之后,我就可以将其组合在一起。我有两个函数被第三个函数调用。第一个函数用于获取我需要的任何图纸的二维数组。这里的假设是我将要相互比较的数组都将在第一列中。
function grabSheetInformation(sheet) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetInfo = ss.getSheetByName(sheet);
var range = sheetInfo.getRange("A2:A").getValues();
var rangeMax = range.filter(String).length;
range = sheetInfo.getRange("A2:A" + (rangeMax + 1)).getValues();
return range;
}
我使用的第二个功能只是在说完所有内容后对数据进行排序。
function sortTargetData() {
var sheetToSort = "Target"; // sheet name that is being sorted
var columnToSortBy = 1; // column A = 1, B = 2, etc.
var rangeToSort = "A2:R";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetToSort);
var range = sheet.getRange(rangeToSort);
range.sort( { column : columnToSortBy, ascending: true } );
}
这是所有东西都融合在一起的地方。
function mergeData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceInfo = grabSheetInformation("Source");
var targetInfo = grabSheetInformation("Target");
var sourceMax = sourceInfo.length;
var targetMax = targetInfo.length;
SpreadsheetApp.setActiveSheet(ss.getSheetByName("Target"));
var sheet = ss.getActiveSheet();
var array = [];
var offset = 1;
for (var i = 0; i < targetMax; i++) {
array.push(targetInfo[i][0]);
}
for (i = 0; i < sourceMax; i++) {
if(array.indexOf(sourceInfo[i][0]) == -1) {
sheet.insertRowAfter(targetMax + offset);
sheet.getRange("A" + (targetMax + offset + 1)).setValue(sourceInfo[i][0]);
offset++;
}
}
// reset variables
sourceInfo = grabSheetInformation("Source");
targetInfo = grabSheetInformation("Target");
sourceMax = sourceInfo.length;
targetMax = targetInfo.length;
sheet = ss.getActiveSheet();
array = [];
for (i = 0; i < sourceMax; i++) {
array.push(sourceInfo[i][0]);
}
for (i = targetMax -1; i >= 0; i--) {
if(array.indexOf(targetInfo[i][0]) == -1) {
sheet.deleteRow(i+2);
}
}
sortTargetData();
}
正如我在最初的问题中所述,该脚本的目的是允许用户拥有一个动态列表,以便他们可以向其中添加静态值。
电子表格的布局将具有两个选项卡,“源”和“目标”。 “源”选项卡的第一列中将包含动态数据,并带有标题。对于我的用例,将使用“ = importrange()”将其拉入。 “目标”标签的第一行将包含标题,并通过脚本进行更新。
如果“源”选项卡中的值不在“目标”选项卡中,则将在“目标”选项卡的列表末尾添加行,并添加缺少的值。
如果“目标”选项卡中的值不在“源”选项卡中,则将删除有问题的行。
我的组织有多个电子表格,各处都有员工姓名。这样做的好处是只有一个名称列表可以更新,而电子表格将使用最新列表自动更新。
还有一种假设是名称不会重复。
我创建的电子表格用于对此进行测试: Shared View Only Spreadsheet