【问题标题】:Copy and Paste in GOOGLE SCRIPT在 GOOGLE SCRIPT 中复制和粘贴
【发布时间】:2021-03-03 16:15:57
【问题描述】:

*我想检查“Sheet1”上的“D”和“E”列。 *IF: => "D" 和 "E" 列的值为空而不是空 => 我想将 Sheet1 中 A:I 中的行复制到 "Sheet2" 中最后一行的下一行; *如果没有满足条件 => 什么都不做

您提供的代码很好,但是在不满足条件时出错。

我想使用 Google Apps 脚本来实现这一点。

SAMPLE1_UPDATED SAMPLE2_UPDATED

【问题讨论】:

  • 欢迎来到 StackOverFlow,请借此机会参加 tour 并学习如何使用 How to Askformat codeminimal reproducible exampleLearn More
  • 很遗憾,我无法理解您当前的问题和目标。我为此道歉。为了正确理解它们,您能否提供更多信息,包括您当前的脚本以及您期望的输入和输出示例情况?
  • 感谢您的回复。我无法理解If there's no condition met => DO NOTHING。我为此道歉。在这种情况下,当“D”和“E”列的值不为空或不为空时,您不想复制行,即使其他行的条件已填充。我的理解正确吗?
  • 感谢您的回复。我不得不为我糟糕的英语水平道歉。不幸的是,我不确定我是否能正确理解If there's no condition met => DO NOTHING。所以我提出了 2 种模式作为答案。你能确认一下吗?如果这些不是您期望的方向,我再次道歉。
  • 感谢您的回复。我带来的不便表示歉意。不幸的是,我无法复制您的情况。因为当我测试脚本时,没有出现错误。我为此道歉。为了正确了解您当前的情况,您能否提供示例电子表格,包括用于复制您的问题的脚本?借此,我想确认一下。顺便说一句,当您发表评论时,您可以评论我的答案吗?这样,我可以通过通知确认您的评论。

标签: google-apps-script google-sheets copy-paste


【解决方案1】:

我相信你的目标如下。

  • 您要检查“Sheet1”上的“D”和“E”列。
  • 当“D”和“E”列的值为空且不为空时,您希望将行的“A”到“I”列复制到“Sheet2”中最后一行的下一行。
  • 您希望使用 Google Apps 脚本实现此目的。

关于If there's no condition met => DO NOTHING,不知道你想实现如下。

  1. 当“D”和“E”列的值不为空或不为空时,您不想复制,即使其他行的条件已满。
  2. 当“D”和“E”列的值不为空或不为空时,您不想复制行。但会复制具有已填充条件的行。

所以,在这个答案中,我提出了以下两种模式。

模式一:

在此模式中,当“D”列和“E”列的值不为空或为空时,脚本不会运行,即使其他行的条件已满。

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet1 = ss.getSheetByName("Sheet1");
  const sheet2 = ss.getSheetByName("Sheet2");
  const obj = sheet1.getRange("A1:I" + sheet1.getLastRow()).getValues().reduce((o, r) => {
    o[(r[3].toString() == "" && r[4].toString() != "") ? "trueCondition" : "falseCondition"].push(r);
    return o;
  }, {falseCondition: [], trueCondition: []});
  if (obj.falseCondition.length == 0) {
    sheet2.getRange(sheet2.getLastRow() + 1, 1, obj.trueCondition.length, obj.trueCondition[0].length).setValues(obj.trueCondition);
  }
}

模式2:

在此模式中,当“D”和“E”列的值不为空或为空时,不会复制行。但是会复制填充条件的行。

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet1 = ss.getSheetByName("Sheet1");
  const sheet2 = ss.getSheetByName("Sheet2");
  const obj = sheet1.getRange("A1:I" + sheet1.getLastRow()).getValues().reduce((o, r) => {
    o[(r[3].toString() == "" && r[4].toString() != "") ? "trueCondition" : "falseCondition"].push(r);
    return o;
  }, {falseCondition: [], trueCondition: []});
  sheet2.getRange(sheet2.getLastRow() + 1, 1, obj.trueCondition.length, obj.trueCondition[0].length).setValues(obj.trueCondition);
}

注意:

  • 在此示例脚本中,“Sheet1”的值是从第一行检索的。当您想更改起始行时,请根据您的实际情况修改"A1:I"

参考资料:

补充:

关于您的以下 2 张示例图片,

下面的示例脚本怎么样?

示例脚本:

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet1 = ss.getSheetByName("Sheet1");
  const sheet2 = ss.getSheetByName("Sheet2");
  const obj = sheet1.getRange("A1:I" + sheet1.getLastRow()).getValues().reduce((o, r) => {
    if ((r[3].toString() != "" && r[4].toString() != "") || (r[3].toString() == "" && r[4].toString() == "") || (r[3].toString() != "" && r[4].toString() == "")) {
      o.falseCondition.push(r);
    } else if ((r[3].toString() == "" && r[4].toString() != "")) {
      o.trueCondition.push(r);
    }
    return o;
  }, {falseCondition: [], trueCondition: []});
  if (obj.trueCondition.length > 0) {
    sheet2.getRange(sheet2.getLastRow() + 1, 1, obj.trueCondition.length, obj.trueCondition[0].length).setValues(obj.trueCondition);
  }
}
  • 在这种情况下,您可以看到未被console.log(obj.falseCondition) 复制的行。

【讨论】:

  • 我添加了 2 个样本的图片,因为您无法打开链接
  • @tt3 感谢您回复并添加示例图片。我必须为我的理解不佳道歉。从您添加的图像中,我无法理解实现If there's no condition met => DO NOTHING 目标的逻辑。我为此道歉。我可以问你目标的细节吗?对了,你想用“C”和“D”2列作为“C”列?
  • 如果 D 为空白 > 什么都不做
  • @tt3 感谢您的回复。从If D is Blank > do notthing,我仍然无法理解实现目标的逻辑。我为此道歉。我可以问你目标的细节吗?对了,你想用“C”和“D”2列作为“C”列?
  • 抱歉造成混淆。我更新了两张图片,希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2015-07-07
相关资源
最近更新 更多