创建新的重复记录表并发送到目标文件夹

Posted

技术标签:

【中文标题】创建新的重复记录表并发送到目标文件夹【英文标题】:Create new sheet of duplicate records and send to destination folder 【发布时间】:2021-09-12 02:54:17 【问题描述】:

希望同时添加一些功能,但遇到了麻烦。我的目标是比较两张表找到重复的名称并将该数据发送到特定文件夹中的新电子表格。现在我有一个包含列表、原始和过滤器的电子表格。与原始列表相比,列表是我要查找重复项的地方,而过滤器是我希望它在创建新工作表时看到的结尾。我目前正在使用公式

=filter(Original!A:F, match(Original!C:C,List!B:B,0)) 来实现过滤器,并希望将其转换为谷歌脚本。从“过滤器”选项卡中,我可以创建电子表格并将其发送到特定文件夹,但由于它是一个公式,它将复制公式而不是值。我听说过使用 contents, text only,但我更喜欢使用一个脚本来过滤、匹配和创建电子表格

以下是电子表格的链接,供大家查看。很抱歉发了这么长的帖子...在此先感谢!

https://docs.google.com/spreadsheets/d/1i5ejG0ldB9EIMtaFezbsJNJS5hbdu9RpyJ4134b9q7s/edit#gid=1328732453

function onOpen() 
  const ui = SpreadsheetApp.getUi();
  const menu = ui.createMenu('Send Sheet');
  menu.addItem('Create Sheet', 'createSheet')
  menu.addToUi();


function createSheet()

var sheet = SpreadsheetApp.getActiveSheet(); // Get current active sheet.
   
var sheet_name = sheet.getRange("J1").getValue(); // Get the value of cell B1, used to name the new spreadsheet.

var folder = DriveApp.getFolderById("xxxxxxxxx"); // Get the ID of the folder where you will place a copy of the spreadsheet.

var newSS = SpreadsheetApp.create(sheet_name); // create new blank spreadsheet in a root folder
var asFile = DriveApp.getFileById(newSS.getId()); // get new spreadsheet as a file

folder.addFile(asFile); // add this file to destination folder
DriveApp.getRootFolder().removeFile(asFile); // remove a file from root folder
  
  var copiedSheet = sheet.copyTo(newSS); // copy active sheet to new spreadsheet
copiedSheet.setName(sheet_name); // rename copied sheet
newSS.deleteSheet(newSS.getSheetByName('Sheet1')); // remove "Sheet1" sheet which was created by default in new spreadsheet


function filter() 
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var trn = ss.getSheetByName("Original");
  var originalData = trn.getRange(2, 1, trn.getLastRow()-1,7).getValues();
  var person = "Jonathan";
  
  var data = originalData.filter(function(item) return item[0] === person );

  var targetSheet = ss.insertSheet(person);
  targetSheet.getRange(2, 1, data.length, data[0].length).setValues(data);

【问题讨论】:

您遇到的具体问题或问题是什么?是不是您的 filter() 函数正在复制公式而不是值? 不,我的 createSheet 函数正在复制公式而不是值。我尝试对我的 copyTo 执行 contentsOnly, true 但它也不起作用 您说的是 createSheet 函数的哪一部分?如果是getValue(),那么试试改成getDisplayValue():developers.google.com/apps-script/reference/spreadsheet/… var sheet = Spreadsheet.getActiveSheet().getDisplayValues();导致错误说明那不是功能。将其更改为 Spreadsheet.getActiveSheet().getActiveRange().getDisplayValues();同样的事情。 考虑到问题确实出在getValue(),我的意思是使用sheet.getRange("J1").getDisplayValue()而不是sheet.getRange("J1").getValue() 【参考方案1】:

contentsOnly, true 仅适用于方法 range.copyTo(),不适用于 sheet.copyTo()

至于方法range.copyTo(),很遗憾你不能用它来将数据复制到不同的电子表格中。

作为一种解决方法,您可以先在新电子表格中创建一个空工作表,然后使用getValues() 和setValues() 复制数据

示例:

修改

var copiedSheet = sheet.copyTo(newSS); // copy active sheet to new spreadsheet
copiedSheet.setName(sheet_name);

var newSheet = newSS.insertSheet();
newSheet.setName(sheet_name);
var dataRange = sheet.getDataRange();
var notation = dataRange.getA1Notation();
var values = dataRange.getValues();
newSheet.getRange(notation).setValues(values):

【讨论】:

以上是关于创建新的重复记录表并发送到目标文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中在一秒钟内发出并发请求时避免重复记录

从两个配置单元表中删除重复数据

在所有 Git 历史记录中搜索字符串 [重复]

高并发时,进行insert操作出现重复记录问题分析

在 Mongoose 中插入新的重复记录时替换旧记录

CodeIgniter - 如果新的或更新的重复记录则插入活动记录