【问题标题】:Make a copy of google sheet into google drive folder将 google sheet 复制到 google drive 文件夹中
【发布时间】:2019-10-15 12:34:49
【问题描述】:

我有两个电子表格。第一个电子表格包含我的原始数据,表明员工编号和员工姓名。第二个电子表格是我要复制到谷歌驱动器文件夹中的电子表格。我想根据第一个电子表格中的员工编号和员工姓名更新第二个电子表格上的特定字段。每次更新第二个电子表格中的单元格时,它都会将第二个电子表格的副本创建到谷歌驱动器文件夹中。

但是,它会继续在复制的电子表格中设置一个值。它不会循环第一个电子表格中的员工姓名和员工编号。

我的代码已经在复制第二个电子表格。只是值没有更新。

 function replicateCards() {
  var ss = SpreadsheetApp.openById('xxxxxxxx');
  var copyCard = SpreadsheetApp.openById('zzzzzzzzz');
  var getID = DriveApp.getFileById(copyCard.getId())
  var card = copyCard.getSheetByName("Card");
  var mastersheet = ss.getSheetByName("Mastersheet");
  var getLastRow = mastersheet.getLastRow();
  var destinationFolder = DriveApp.getFolderById('yyyyyyyyyy');
  ;
  var changeColorToGrayList = card.getRangeList(['C7', 'E7', 'G7', 'I7', 'K7', 'M7', 'O7', 'Q7',
                                                 'C9', 'E9', 'G9', 'I9', 'K9', 'M9', 'O9', 'Q9',
                                                 'C11', 'E11', 'G11', 'I11', 'K11', 'M11', 'O11', 'Q11']);
  var setValueToZero = card.getRangeList(['C8', 'E8', 'G8', 'I8', 'K8', 'M8', 'O8', 'Q8',
                                          'C10', 'E10', 'G10', 'I10', 'K10', 'M10', 'O10', 'Q10',
                                          'C12', 'E12', 'G12', 'I12', 'K12', 'M12', 'O12', 'Q12']);

  for (i = 1; i < getLastRow; i++) {

    var employeeNumber = mastersheet.getRange(i + 1, 1).getValue();
    var employeeName = mastersheet.getRange(i + 1, 2).getValue();
    card.getRange("C3").setValue(employeeName);
    card.getRange("H3").setValue(employeeNumber);
    card.setActiveRangeList(changeColorToGrayList).setBackground("gray");
    card.setActiveRangeList(setValueToZero).setValue(0);
    //    var getID = DriveApp.getFileById(card).getId(); 
    getID.makeCopy(employeeNumber + " High Flyer Card", destinationFolder);
  }
}

我希望getID.makeCopy(employeeNumber + " High Flyer Card", destinationFolder); 的输出包含不同的员工编号和员工姓名,而不仅仅是 google 文件夹中的一个值。

【问题讨论】:

  • 您不应该使用:var getID = DriveApp.getFileById(card.getId()); 而不是 var getID = DriveApp.getFileById(***copy***Card.getId());
  • 嗨@a-burge。对不起。我很困惑。你能详细说明吗?我也更新了代码供您参考。 =)

标签: javascript for-loop google-apps-script google-sheets


【解决方案1】:

您的代码应该按预期工作,除非大文件使代码重叠。

如果是这样,flush() 的实现将使您的代码按顺序运行,详细说明请参阅here

在您的情况下,将 for 循环修改为

  for (i = 1; i < getLastRow; i++) {
    var employeeNumber = mastersheet.getRange(i + 1, 1).getValue();
    var employeeName = mastersheet.getRange(i + 1, 2).getValue();
    card.getRange("C3").setValue(employeeName);
    card.getRange("H3").setValue(employeeNumber);
    card.setActiveRangeList(changeColorToGrayList).setBackground("gray");
    card.setActiveRangeList(setValueToZero).setValue(0);
    getID.makeCopy(employeeNumber + " High Flyer Card", destinationFolder);
    SpreadsheetApp.flush();  
  }

应该能解决问题。

【讨论】:

  • 我的意图是实际覆盖 C3 和 H3 单元格中的值,然后将电子表格复制到每个循环的谷歌驱动器文件夹中。所以假设我有来自 Mastersheet 的 2 条记录。我的谷歌驱动器文件夹中应该有 2 张复制的卡,具有不同的员工编号和员工姓名。道歉。我仍然是使用 Apps 脚本的新手。 =)
  • 对不起,我误解了你的意图。您能否提供您的完整代码,其中定义了 card、copyCard 等,以便更容易排除故障?
  • 也为混淆表示歉意。我现在更新了代码@ziganotschka。应该发生的事情是: 1. 创建一个覆盖员工编号和员工姓名的循环。这些值来自原始数据。 2. 每次更改/覆盖员工编号和员工姓名时,制作卡片电子表格的副本。 3. 将其保存到谷歌驱动器文件夹。因此,如果我的原始数据中有 2 条记录,我应该有 2 份卡片电子表格副本,其中包含不同的员工编号和姓名。希望现在更清楚了。谢谢你的帮助兄弟=)
  • 我运行了您的代码,它按预期工作。也许您的电子表格有问题。我可以看看,如果你分享。请务必先对其进行消毒,不要提供任何私人信息。
  • 嗨@ziganotschka。看来flush() 解决了这个问题!!!谢谢你!!如果它也适用于许多记录,我现在正在测试它!