我工作在眼镜片上,认为我需要使用谷歌应用程序脚本来做我想做的事情,但我是一家非营利性大学医院的心理学家,我试图做一些好事,而不是程序员(这可能说明了这一点),我非常需要帮助。我正试图建立一系列的电子表格,以跟踪参加研讨会的我们的治疗方法。
1)我有一个表格“Participant_Registration”,其中输入了基本信息
2)我只想将信息从“Participant_Registration”的前四栏(A:D)转移到第二页“Learning_Sessions_Attendance”
3)我还将同样的信息传递给第三张纸“Consultation1_Attendance”--但我需要首先过滤并只选择分配给该组的人员。
这是我的电子表格副本的链接。tO3gtSJ4UJ8/edit?usp=sharing
更笼统地说,这就是我想要做的。这在谷歌应用程序脚本中是可能的吗?看起来应该是这样。
1)我在sheet1中有原始数据
2)我希望前四列(A:D)转移到sheet2 (如果我需要触发器变量的话)。
3)我希望它们以这样一种方式传递,即如果对任何一张表进行排序,数据仍然很好(仍然链接到正确的行)。
4)理想情况下,如果源表(Sheet1)中的数据发生了更改,则Sheet2中也会进行相同的更改。
5)理想情况下,这一切都会自动发生,而无需通过脚本进行人为干预。
有什么主意吗?我非常需要你的帮助。我一直在论坛,git中心,并做了大量的搜索,并试图跟随许多例子,我看到了,但没有任何效果。我真的需要帮助。
下面是我的示例脚本,每个脚本都有一个问题:
//以下代码按我的要求复制从sheet1到sheet2的范围。如果我们从sheet1复制数据,然后将数据添加到sheet2上的其他列,就会出现问题。稍后,如果我们对某个变量进行排序(人们必须这样做),如果再次部署该函数,它将覆盖数据,这意味着来自sheet1的数据没有连接到sheet2上的正确个体。
function CopyRange() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Participant_Registration");
var range = sheet.getRange("A14:D");
var values = range.getValues();
var target = ss.getSheetByName("Learning_Sessions_Attendance");
var target_range = target.getRange("A10:D");
range.copyTo(target_range);
}所以我再试一次。这一次,我尝试将最后编辑的行从sheet1复制到sheet2。这个功能似乎对我不起作用。
function CopyRow2() {
// Get Spreadsheets
var source = SpreadsheetApp.openById("1egn6pnRd6mKMGuQxX_jtgwYDtkuMUv2QJItLdh7aIEs");
var target = SpreadsheetApp.openById("1egn6pnRd6mKMGuQxX_jtgwYDtkuMUv2QJItLdh7aIEs");
// Set Sheets
var source_sheet = source.getSheetByName("Participant_Registration");
var target_sheet = target.getSheetByName("Learning_Sessions_Attendance");
var rowIdx = source_sheet.getActiveRange().getRowIndex();
var rowValues = source_sheet.getRange(rowIdx,1,1,source_sheet.getLastRow()).getValues();
Logger.log(rowValues);
var destValues = [];
destValues.push(rowValues[0][0]);// copy data from col A to col A
destValues.push(rowValues[0][1]);//copy data from col B to col B
destValues.push(rowValues[0][2]);//copy data from col C to col C
destValues.push(rowValues[0][3]);//copy data from col D to col D
var dest=source.getSheets()[4];
dest.getRange(dest.getLastRow()+1,1,1,destValues.length).setValues([destValues]);//update destination sheet with selected values in the right order, the brackets are there to build the 2D array needed to write to a range
}所以我一次又一次地尝试。我有很多例子,但似乎都没有用。
非常感谢。钱德拉
发布于 2015-06-08 03:17:15
要使这种情况自动发生(一个工作表的更改更新另一个工作表),无论何时更改单元格,您肯定都需要一个“事件/触发器”来运行脚本。(这是"onEdit()“函数)。
但是,由于脚本有时可能会失败(即使它们是完美的,这是因为一些Google问题),所以不能保证这些脚本总是包含相同的数据。
但是,如果我可以建议另一种方式,不要让ID是可选的。如果这是一个真实的ID (如个人身份证号码),创建另一个专用于工作表的ID。
我已经编辑了你的第二张表格,给出了如何不用脚本来做它的建议。你必须意识到的唯一事情是:
VLOOKUP论坛将在第一个工作表中搜索该ID,并在同一行中返回数据。你可以用你喜欢的方式对任何一张纸进行排序。只要你不改变别人的身份证。
因此,在第2页中,请在First Name、Last Name和Email address中使用这个
=vlookup(A10,Participant_Registration!$A:$D,2,false)
=vlookup(A10,Participant_Registration!$A:$D,3,false)
=vlookup(A10,Participant_Registration!$A:$D,4,false)只需向下扩展这个公式
我希望这能帮到你。为此,我将不惜任何代价避免编写脚本。这将是我最后的选择。(如果要重新排列工作表,也需要修改脚本,如果没有,它们可能会造成麻烦,编写现有的数据.)
我还添加了一个按钮(插入-绘图)并将脚本放入其中(右键,单击向下箭头,"transfer? script“--从葡萄牙语翻译而来)。
如果锁定sheet2中的所有四列并锁定第一页中的ID列,人们将无法更改ID并造成混乱。它们可以编辑工作表1中的人员,而不更改sheet2中的公式。脚本不受排序或空空间的影响(它会在它找到的第一个空行中添加人员)。
我为四个列标题添加了“命名范围”。(对于指定的范围,脚本可以引用名称而不是坐标,这使您能够重新安排工作表插入和删除列,或者用剪切和粘贴移动它们--但是如果您重新排列列,则需要手动更新VLOOKUP公式)。
下面是代码:(如果您能够创建对话框并在该对话框中请求用户的数据,那么您可以锁定所有内容--除了add之外,您还需要一个编辑按钮)。
function AddPerson()
{
var S1Name = "Participant_Registration";
var S2Name = "Learning_Sessions_Attendance";
var ID1Name = "regID";
var ID2Name = "learnID";
//these vars are not used in this script
var FN1Name = "regFirstName";
var FN2Name = "learnFirstName";
var LN1Name = "regLastName";
var LN2Name = "learnLastName";
var Email1Name = "regEmail";
var Email2Name = "learnEmail";
var sSheet = SpreadsheetApp.getActiveSpreadsheet();
var Sheet1 = sSheet.getSheetByName(S1Name);
var Sheet2 = sSheet.getSheetByName(S2Name);
var ID1 = getRangeByName(sSheet, Sheet1.getName(), ID1Name);
var ID2 = getRangeByName(sSheet, Sheet2.getName(), ID2Name); Logger.log("ID2: " + ID2.getValue());
var Empty1 = getFirstEmpty(ID1);
var Empty2 = getFirstEmpty(ID2);
var Biggest1 = getBiggestID(ID1); Logger.log("Biggest 1: " + Biggest1);
var Biggest2 = getBiggestID(ID2); Logger.log("Biggest 2: " + Biggest2);
if (Biggest1 !== Biggest2)
Browser.msgBox("Warning: there are IDs in one sheet that are not in the other sheet");
var Biggest;
if (Biggest1 > Biggest2) Biggest = Biggest1;
else Biggest = Biggest2;
Biggest++;
Empty1.setValue(Biggest);
Empty2.setValue(Biggest);
}
function getFirstEmpty(Header)
{
while (Header.getValue() !== "")
{
Header = Header.offset(1,0);
}
return Header;
}
function getBiggestID(Header)
{
var Sheet = Header.getSheet();
var LastRow = Sheet.getLastRow();
var Values = Sheet.getRange(Header.getRow(), Header.getColumn(), LastRow - Header.getRow() + 1).getValues();
var len = Values.length;
var MaxID = 1;
for (var i = 0; i < len; i++)
{
var val = Number(Values[i]);
if (!isNaN(val) && val > MaxID)
MaxID = val;
}
return MaxID;
}
function getRangeByName(spreadSheet, sheetName, rangeName)
{
Logger.log("Trying range: " + "'" + sheetName + "'!" + rangeName);
return spreadSheet.getRangeByName("'" + sheetName + "'!" + rangeName);
}https://stackoverflow.com/questions/30700379
复制相似问题