【问题标题】:How to prevent erase of cells in another Google Sheet file with Query/importrange如何使用 Query/importrange 防止擦除另一个 Google Sheet 文件中的单元格
【发布时间】:2019-07-12 22:00:14
【问题描述】:

我正在尝试设置 2 个谷歌表格文件,其中文件 1 用于当天购买;日期、客户名称、付款类型、他们支付的金额以及他们在表格中支付的费用。文件 2 将复制文件 1 中的内容,基本上作为该月的长期记录。我正在使用 QUERY 和 IMPORTRANGE 导入数据,并将其保存在文件 2 仅在购买日期在该特定月份时才会复制的位置。

我的问题是,如果我删除文件 1 中的任何内容,它将删除或更改文件 2 中的任何内容。因此,如果我们今天购买了 3 件商品并且我在一天结束时删除了它们,它们将在文件 2 中被删除为好。我需要帮助找到一种方法,文件 2 将复制数据,但如果文件 1 删除数据,则不会删除任何内容。

我试过用谷歌搜索我的答案,但找不到。

这是我在文件 2 中使用的公式:

  • 日志是一个命名范围,它指向我希望从中复制文件 1 的位置

=QUERY((IMPORTRANGE("File 1 url (Erased for security reasons)", "Logs")),"select Col1,Col2,Col3,Col4,Col5, Col6,Col7 where Col1 >= date '"&TEXT(DATEVALUE("7/1/2019"),"yyyy-mm-dd")&"' and Col1 < date '"&TEXT(DATEVALUE("8/1/2019"),"yyyy-mm-dd")&"'",0)

【问题讨论】:

  • 要“归档”东西,你需要一个脚本。这与公式无关。
  • 如果我写了一个脚本,我仍然可以使用公式来导入数据还是我也需要为此编写一个脚本?
  • 你知道为什么在删除文件1中的数据时,为什么要删除文件2中的数据吗?你有任何 onEdit() 函数在运行吗?
  • @Cooper 不是因为它基本上是在镜像文件 1 中的任何内容?
  • 是不是因为您每次编辑时都将 file1 中的所有内容导入到 file2 中?如果是这样,听起来你可能真的不想这样做。

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

这里的问题是您的第二张工作表将根据第一张工作表的运行编辑进行更新。如果您想将值保留在存档表中,则需要复制这些值,并在您复制的单元格之间建立链接。

您可以使用一个小的 Apps 脚本函数来实现这一点,您可以将绑定脚本从绑定脚本到其中一个电子表格,也可以使用独立脚本:

function copyFromOneSheetToAnother() {
  var sheet1 = SpreadsheetApp.openById("ID of Spreadsheet to copy from");
  var sheet2 = SpreadsheetApp.openById("ID of Spreadsheet to copy to");
  var currDate = new Date();
  var editedDate = new Date(currDate - 86400000);

  var insert = sheet1.getSheetByName("Name of sheet to copy from");
  var archive = sheet2.getSheetByName("Name of sheet to copy to");
  var insertData = insert.getRange(2, 1, (sheet1.getRange('A:A').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()), 28);

  for (row = 2; row <= insertData.getNumRows(); row++){
    var data = insert.getRange(row, 1, 1, 28).getValues();

    if (data[0][0] < currDate && data[0][0] > editedDate){
     archive.getRange((archive.getLastRow() + 1), 1, 1, 28).setValues(data).setNumberFormat("MM/dd/yyyy");
    }    
  }  
}

【讨论】:

  • 非常感谢您的帮助!它的效果惊人。不过,我确实有一个问题,如何更改它以使 setNumber 不会将常规数字更改为日期格式?我有一列将产品的价格放在该单元格中。当脚本运行时,它将单元格从 $45.00 更改为 2/13/10009。再次感谢您的帮助
  • 当然,第 5 行的 - 86400000 将一天减少了一天,因为它使用 Unix 时间(以毫秒为单位),而第 15 行的 .setNumberFormat("MM/dd/yyyy") 将 unix 时间的格式设置回一个约会。您可以删除其他数字类型的格式方法,例如 $45.00
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
相关资源
最近更新 更多