首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据Sheet1复制到Sheet2,以便对两个工作表进行排序和编辑(google应用程序脚本?)

将数据Sheet1复制到Sheet2,以便对两个工作表进行排序和编辑(google应用程序脚本?)
EN

Stack Overflow用户
提问于 2015-06-08 02:09:07
回答 1查看 1.7K关注 0票数 1

我工作在眼镜片上,认为我需要使用谷歌应用程序脚本来做我想做的事情,但我是一家非营利性大学医院的心理学家,我试图做一些好事,而不是程序员(这可能说明了这一点),我非常需要帮助。我正试图建立一系列的电子表格,以跟踪参加研讨会的我们的治疗方法。

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上的正确个体。

代码语言:javascript
复制
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。这个功能似乎对我不起作用。

代码语言:javascript
复制
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
}

所以我一次又一次地尝试。我有很多例子,但似乎都没有用。

非常感谢。钱德拉

EN

回答 1

Stack Overflow用户

发布于 2015-06-08 03:17:15

要使这种情况自动发生(一个工作表的更改更新另一个工作表),无论何时更改单元格,您肯定都需要一个“事件/触发器”来运行脚本。(这是"onEdit()“函数)。

但是,由于脚本有时可能会失败(即使它们是完美的,这是因为一些Google问题),所以不能保证这些脚本总是包含相同的数据。

但是,如果我可以建议另一种方式,不要让ID是可选的。如果这是一个真实的ID (如个人身份证号码),创建另一个专用于工作表的ID。

我已经编辑了你的第二张表格,给出了如何不用脚本来做它的建议。你必须意识到的唯一事情是:

  • 不要创建两个ID相同的人。
  • 您必须手动在第二个工作表中插入(仅) ID。

VLOOKUP论坛将在第一个工作表中搜索该ID,并在同一行中返回数据。你可以用你喜欢的方式对任何一张纸进行排序。只要你不改变别人的身份证。

因此,在第2页中,请在First NameLast NameEmail address中使用这个

代码语言:javascript
复制
 =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之外,您还需要一个编辑按钮)。

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30700379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档