我正试图编写一个脚本,根据主题是否出现在每个选项卡的特定年份范围内,为一行中的每个主题构建一个列表。
以下是我的数据样本版本供参考:https://docs.google.com/spreadsheets/d/1fRhsIAeQd2qDIWILhvhnoTr1Po009RljdjrL9TYwncI/edit#gid=0.
我手动填写了"历史记录"选项卡上的一些行列B,但这正是我希望脚本生成的内容(单元格高亮显示为红色)。
到目前为止,我最好的想法是为所有名称创建一个对象,并使用for循环遍历每个名称。。。然后为每个角色和年份创建单独的对象,并通过条件检查循环这些对象以搜索名称。如果名称出现在该年份范围内,也许我可以将一些文本推送到新对象?
我开始为此写剧本,但很快意识到这将是非常痛苦和低效的。有什么想法可以让我更有效地做到这一点吗?我的数据可以追溯到数百人的几年前,所以手动更新不再是一种选择!
谢谢!!
function buildHistory() {
var ss = SpreadsheetApp.getActive();
var historySheet = ss.getSheetByName("History");
var names = historySheet.getRange(2, 1, historySheet.getLastRow(), 1).getValues();
var pastMems = ss.getSheetByName("Past Members");
var mems2015 = pastMems.getRange(3, 2, pastMems.getLastRow(), 1).getValues();
var mems2014 = pastMems.getRange(3, 5, pastMems.getLastRow(), 1).getValues();
for (var i = 0; i < names.length; i++) {
var name = names[i];
Logger.log(name);
for (var j = 0; j < mems2015.length; j++) {
if (mems2015[j] == name) {
Logger.log("Mem in 2015");
} else if (mems2014[j] == name) {
Logger.log("Mem in 2014");
}
}
}
}
这是我构建代码的方式。这个例子是不完整的。我没有试着运行它。它旨在展示程序如何运行以及数据如何处理的基本策略。同样,代码是不完整的。代码确实有一种方法可以动态地确定工作表中每年的开始列。它展示了如何将一个名字与此人的历史联系起来。
var masterObject = {};
var ss = SpreadsheetApp.getActiveSpreadsheet();
function masterFunction() {
initialPopulationOfMasterObject();
processPastVolunteersSheet();
processPastSponsersSheet();
addDataToHistory();
};
function initialPopulationOfMasterObject() {
var historySheet = ss.getSheetByName("History");
var names = historySheet.getRange(2, 1, historySheet.getLastRow(), 1).getValues();
var i=0;
for (i=0;i<names.length;i+=1) {
masterObject.thisPerson = names[i];
masterObject.theirHistory = []; //array for list of this person's history
};
};
function processPastVolunteersSheet() {
var volunteersSheet = ss.getSheetByName("Past Volunteers");
var numberOfYears = 3;
var yrs = 0, thisYrsData=[], startColumn;
var j=0, thisName="", thisYr="";
for (yrs=0;yrs<numberOfYears;yrs+=1) {
if (yrs=0) {
startColumn = 1;
thisYr = volunteersSheet.getRange(1, startColumn, 1,1).getValue();
} else {
startColumn = yrs*3;
thisYr = volunteersSheet.getRange(1, startColumn, 1,1).getValue();
};
thisYrsData=volunteersSheet.getRange(2, startColumn, volunteersSheet.getLastRow(),2).getValues();
for (j=0;j<thisYrsData;j+=1) {
masterObject[thisName].push("Volunteer (" + thisYr);
};
};
};