- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Google 电子表格中有两个工作表:
输入数据通过 importxml
函数进入获取数据
工作表。
但是,我想将获取数据
工作表的所有值复制到最终数据
工作表,如果有重复项(以行数计),则附加唯一的值行。
这是我尝试过的:
function onEdit() {
//get the data from old Spreadsheet
var ss = SpreadsheetApp.openById("1bm2ia--F2b0495iTJotp4Kv1QAW-wGUGDUROwM9B-D0");
var dataRange = ss.getSheetByName("Get Data").getRange(1, 1, ss.getLastRow(), ss.getLastColumn());
var dataRangeFinalData = ss.getSheetByName("Final Data").getRange(1, 1, ss.getLastRow(), ss.getLastColumn());
var myData = dataRange.getValues();
//Open new Spreadsheet & paste the data
newSS = SpreadsheetApp.openById("1bm2ia--F2b0495iTJotp4Kv1QAW-wGUGDUROwM9B-D0");
Logger.log(newSS.getLastRow());
newSS.getSheetByName("Final Data").getRange(newSS.getLastRow()+1, 1, ss.getLastRow(), ss.getLastColumn()).setValues(myData);
//remove duplicates in the new sheet
removeDups(dataRangeFinalData)
}
function getId() {
Browser.msgBox('Spreadsheet key: ' + SpreadsheetApp.getActiveSpreadsheet().getId());
}
function removeDups(array) {
var outArray = [];
array.sort(lowerCase);
function lowerCase(a,b){
return a.toLowerCase()>b.toLowerCase() ? 1 : -1;// sort function that does not "see" letter case
}
outArray.push(array[0]);
for(var n in array){
Logger.log(outArray[outArray.length-1]+' = '+array[n]+' ?');
if(outArray[outArray.length-1].toLowerCase()!=array[n].toLowerCase()){
outArray.push(array[n]);
}
}
return outArray;
}
您可以在下面找到示例电子表格的链接:
我的问题是数据没有被粘贴。
感谢您的回复!
最佳答案
tl;dr:请参阅底部的脚本。
安onEdit()
函数不适合您的用例,因为电子表格函数修改的单元格内容不被视为“编辑”事件。您可以阅读更多相关信息 in this answer 。如果您希望此操作自动化,那么定时触发功能将是合适的。或者,您可以通过菜单项手动调用该功能。我将把这个问题留给您来决定,因为您问题的真正核心是如何确保最终数据集中的行级唯一性。
尽管您的原始代码不完整,但您似乎打算首先利用不区分大小写的字符串比较从源数据中删除重复项。我建议使用其他一些 JavaScript 魔法来代替。
我们对目标数据的唯一性感兴趣,因此我们需要一种方法将新行与已有的行进行比较。如果我们有字符串或数字数组,那么我们可以使用 How to merge two arrays in Javascript and de-duplicate items 中的技术。 。然而,这里有一个复杂的问题,因为我们有一个数组的数组,并且数组不能直接比较。
很好 - 我们仍然可以逐个元素地比较行,这需要对我们正在比较的行中的所有列进行简单的循环。简单,但速度慢,我们称之为 O(n2) solution (n 方阶)。随着要比较的行数增加,唯一比较操作的数量将呈指数增长。所以,我们不要这样做。
相反,我们将创建一个单独的数据结构来镜像我们的目标数据,但对于比较非常有效,即 hash .
在 JavaScript 中,我们可以通过对象的名称或键快速访问对象的属性。此外,该键可以是任何字符串。然后,我们可以创建一个简单的哈希表,其中包含一个对象,该对象的属性使用从目标数据行生成的字符串命名。例如,这将创建一个哈希对象,然后添加数组 row
给它:
var destHash = {};
destHash[row.join('')] = true; // could be anything
要创建我们的 key ,我们是 join
计算 row
中的所有值没有分隔符的数组。现在,为了测试行的唯一性,我们只需检查是否存在具有相同形式键的对象属性。像这样:
var alreadyExists = destHash.hasOwnProperty(row.join(''));
一个额外的考虑因素:由于源数据可能包含目标数据中尚未存在的重复行,因此我们需要在识别出唯一行时不断扩展哈希表。
JavaScript 提供了两个内置数组方法,我们将使用它们 filter出已知行,并且 concatenate我们的目标数据只有唯一的行。
简单来说,它看起来像这样:
// Concatentate source rows to dest rows if they satisfy a uniqueness filter
var mergedData = destData.concat(sourceData.filter(function (row) {
// Return true if given row is unique
}));
您可以将其理解为“创建一个名为 mergedData
的数组,该数组由名为 destData
的数组的当前内容组成,并将 sourceData
数组的过滤行连接到它。”
您会发现,由于已经提到的其他注意事项,最终的函数会稍微复杂一些。
一旦我们有了mergedData
数组,只需将其写入目标Sheet即可。
填充行:源数据包含宽度不一致的行,这在调用 setValues()
时会出现问题,它期望所有行都被平方。这将要求我们检查并填充行以避免此类错误:
Incorrect range width, was 6 but should be 5 (line ?, file "Code")
填充行由 push
完成在行数组末尾删除空白“单元格”,直到达到预期长度。
for (var col=mergedData[row].length; col<mergedWidth; col++)
mergedData[row].push('');
处理完每一行后,我们终于准备好写出结果了。
function appendUniqueRows() {
var ss = SpreadsheetApp.getActive();
var sourceSheet = ss.getSheetByName('Get Data');
var destSheet = ss.getSheetByName('Final Data');
var sourceData = sourceSheet.getDataRange().getValues();
var destData = destSheet.getDataRange().getValues();
// Check whether destination sheet is empty
if (destData.length === 1 && "" === destData[0].join('')) {
// Empty, so ignore the phantom row
destData = [];
}
// Generate hash for comparisons
var destHash = {};
destData.forEach(function(row) {
destHash[row.join('')] = true; // could be anything
});
// Concatentate source rows to dest rows if they satisfy a uniqueness filter
var mergedData = destData.concat(sourceData.filter(function (row) {
var hashedRow = row.join('');
if (!destHash.hasOwnProperty(hashedRow)) {
// This row is unique
destHash[hashedRow] = true; // Add to hash for future comparisons
return true; // filter -> true
}
return false; // not unique, filter -> false
}));
// Check whether two data sets were the same width
var sourceWidth = (sourceData.length > 0) ? sourceData[0].length : 0;
var destWidth = (destData.length > 0) ? destData[0].length : 0;
if (sourceWidth !== destWidth) {
// Pad out all columns for the new row
var mergedWidth = Math.max(sourceWidth,destWidth);
for (var row=0; row<mergedData.length; row++) {
for (var col=mergedData[row].length; col<mergedWidth; col++)
mergedData[row].push('');
}
}
// Write merged data to destination sheet
destSheet.getRange(1, 1, mergedData.length, mergedData[0].length)
.setValues(mergedData);
}
关于javascript - 将值从一张纸粘贴到另一张纸并删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33763928/
我的问题:非常具体。我正在尝试想出解析以下文本的最简单方法: ^^domain=domain_value^^version=version_value^^account_type=account_ty
好吧,这就是我的困境: 我正在为 Reddit 子版 block 开发常见问题解答机器人。我在 bool 逻辑方面遇到了麻烦,需要一双更有经验的眼睛(这是我在 Python 中的第一次冒险)。现在,该
它首先遍历所有 y 值,然后遍历所有 x 值。我需要 X 和 y 同时改变。 For x = 3 To lr + 1 For y = 2 To lr anyl.Cells(x, 1)
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
如何转换 Z-score来自 Z-distribution (standard normal distribution, Gaussian distribution)到 p-value ?我还没有找到
我正在重写一些 Javascript 代码以在 Excel VBA 中工作。由于在这个网站上搜索,我已经设法翻译了几乎所有的 Javascript 代码!但是,有些代码我无法准确理解它在做什么。这是一
我遇到过包含日期格式的时间戳日期的情况。然后我想构建一个图表,显示“点击”项目的数量“每天”, //array declaration $array1 = array("Date" => 0); $a
我是scala的新手! 我的问题是,是否有包含成员的案例类 myItem:Option[String] 当我构造类时,我需要将字符串内容包装在: Option("some string") 要么 So
我正在用 PHP 创建一个登录系统。我需要用户使用他或她的用户名或电子邮件或电话号码登录然后使用密码。因为我知道在 Java 中我们会像 email==user^ username == user 这
我在 C++ 项目上使用 sqlite,但是当我在具有文本值的列上使用 WHERE 时出现问题 我创建了一个 sqlite 数据库: CREATE TABLE User( id INTEGER
当构造函数是显式时,它不用于隐式转换。在给定的代码片段中,构造函数被标记为 explicit。那为什么在 foo obj1(10.25); 情况下它可以工作,而在 foo obj2=10.25; 情况
我知道这是一个主观问题,所以如果需要关闭它,我深表歉意,但我觉得它经常出现,让我想知道是否普遍偏爱一种形式而不是另一种形式。 显然,最好的答案是“重构代码,这样你就不需要测试是否存在错误”,但有时没有
这两个 jQuery 选择器有什么区别? 以下是来自 w3schools.com 的定义: [attribute~=value] 选择器选择带有特定属性,其值包含特定字符串。 [attribute*=
为什么我们需要CSS [attribute|=value] Selector根本当 CSS3 [attribute*=value] Selector基本上完成相同的事情,浏览器兼容性几乎相似?是否存在
我正在解决 regx 问题。我已经有一个像这样的 regx [0-9]*([.][0-9]{2})。这是 amont 格式验证。现在,通过此验证,我想包括不应提供 0 金额。比如 10 是有效的,但
我正在研究计算机科学 A 考试的样题,但无法弄清楚为什么以下问题的正确答案是正确的。 考虑以下方法。 public static void mystery(List nums) { for (
好的,我正在编写一个 Perl 程序,它有一个我收集的值的哈希值(完全在一个完全独立的程序中)并提供给这个 Perl 脚本。这个散列是 (string,string) 的散列。 我想通过 3 种方式对
我有一个表数据如下,来自不同的表。仅当第三列具有值“债务”并且第一列(日期)具有最大值时,我才想从第四列中获取最大值。最终值基于 MAX(DATE) 而不是 MAX(PRICE)。所以用简单的语言来说
我有一个奇怪的情况,只有错误状态保存到数据库中。当“状态”应该为 true 时,我的查询仍然执行 false。 我有具有此功能的 Controller public function change_a
我有一个交易表(针对所需列进行了简化): id client_id value 1 1 200 2 2 150 3 1
我是一名优秀的程序员,十分优秀!