当前位置: 首页 > 知识库问答 >
问题:

将数据表1复制到表2以便进行排序

孙池暝
2023-03-14

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

1) 我有一张“参与者注册”表,其中输入了基本信息

2)我想将信息从Participant_Registration的前四列(A: D)转移到第二张Learning_Sessions_Attendance

3)我也将相同的信息传输到第三张Consultation1_Attendance-但是我需要首先过滤并只选择那些分配给该组的人。

这是我的电子表格副本的链接。https://docs.google.com/spreadsheets/d/17d0bT4LZOx5cyjSUHPRFgEZTz4y1yEL_tO3gtSJ4UJ8/edit?usp=sharing

更一般地说,这就是我要做的。这在谷歌应用程序脚本中可能吗?看来应该是这样。

1)我有原始数据在表格1

2)我希望前四列(A: D)转移到sheet2(如果我需要一个触发变量,这是罚款)

3) 我希望它们以这样一种方式传输,即如果对其中一张表进行排序,则数据仍然很好(仍然链接到右行)。

4) 理想情况下,如果源表(表1)中的数据发生更改,则表2中也会发生相同的更改。

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
}

所以我试了一次又一次。我有很多例子,但没有一个是有效的。

非常感谢。钱德拉

共有1个答案

慕容聪
2023-03-14

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

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

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

我已经编辑了你的第二张工作表,其中显示了如何在不使用脚本的情况下完成这项工作的建议。您必须注意的唯一事项是:

  • 不要创建具有相同ID的两个人。
  • 您必须(仅)在第二张图纸中手动插入ID

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

因此,在第2页中,在名字姓氏电子邮件地址中使用此项:

 =vlookup(A10,Participant_Registration!$A:$D,2,false)
 =vlookup(A10,Participant_Registration!$A:$D,3,false)
 =vlookup(A10,Participant_Registration!$A:$D,4,false)

把这个公式向下延伸

我希望这有帮助。我将不惜任何代价避免为此编写脚本。这将是我最后的选择。(如果您想重新安排工作表,也需要更改脚本,如果不更改,则可能会导致问题,改写现有数据…)

我还添加了一个按钮(插入-绘图),并在其中放入一个脚本(右键,单击向下箭头,“传输?脚本"----译自葡萄牙语)。

如果您锁定了sheet2中的所有四列,并锁定了Sheet1中的ID列,人们将无法更改ID并造成混乱。他们可以编辑工作表1中的人员,而不更改工作表2中的公式。脚本不受排序或空格的影响(它在找到的第一个空行中添加人员)。

我为四列标题添加了“命名范围”。(对于命名范围,脚本可以引用名称而不是坐标,这使您能够重新排列图纸插入和删除列,或通过剪切和粘贴移动它们-但是如果重新排列列,则需要手动更新VLOOKUP公式)。

下面是代码:(如果您设法创建对话框并在该对话框中请求此人的数据,那么您可以锁定所有内容,并且除了“添加”按钮外,您还需要一个编辑按钮,这样做会更好)。

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);
}
 类似资料:
  • 我环顾四周,尝试了一些我读过的解决方案。我试图创建一个pl/sql触发器,如果满足子句,它会将数据从一个表复制到另一个表。我觉得我可能只是犯了一个愚蠢的语法错误,而不是一个完全关键的错误,但希望能得到一些帮助。 以下是错误 6.4 PLS-00201:必须声明标识符“STATUS\u ID” 6 1 PL/SQL:语句被忽略

  • 我有两个SQL表 表 1: 列1, 列2, 列3, 列4, 列5, 列6, 列7 表 2: 列1, 列2, 列4, 列5, 列10 (新列) 应该被赋予默认值0 我需要将数据从表1复制到表2

  • 我对Excel VB脚本非常陌生,我正在寻找有关如何将特定单元格数据复制到带有表格的新工作表中并在每次按下复制按钮时添加新行的信息。让我尝试更好地解释我有1个名为值的工作表和一个名为数据的工作表 Excel 2013版 单元格A2、H17、H19、H21、H23、H25、H27、H29、H31、H33、H35和H37中的价值表信息 数据表 Tablename:SurveyData表头名称AGran

  • 在SQL Server中,如何将数据从一个表复制/追加到具有相同架构的另一个表中? 编辑: 假设有一个问题 它使用与表2中相同的模式和数据创建表1。 有没有这样的短查询只将整个数据复制到一个已经存在的表中?

  • 我有一个像这样的数据框- 我有一个这样的列表- 现在,我想根据列名列表对数据框进行排序 因此,新的数据框将有列名称-

  • 问题内容: 第一次尝试熊猫,我试图先按照索引对数据透视表进行排序,然后再对一系列值进行排序。 到目前为止,我已经尝试过: 按索引然后按值对数据透视表进行排序的正确方法是什么? 问题答案: 这是一个可以做您想要的解决方案: 结果将如下所示: 将其作为API方法内置到熊猫中会很好。虽然不确定应该是什么样。