Javascript 将数组从文档属性与数据范围进行比较不起作用
所以我有一个脚本(GoogleApps脚本),它从我的一张工作表(成对:缩写和百分比)中提取数据,这些数据的值是不断变化的(有时是每周的,有时是每天的) 它应该检查旧值和新值,并且只处理新值,但出于某种原因,它正在处理所有值 在循环过程中,它首先查找附加到该单元格的电子邮件,然后向此人发送生成的电子邮件。然后在最后,它存储在上一个数据库中找到的新值 获取新数据和变量Javascript 将数组从文档属性与数据范围进行比较不起作用,javascript,arrays,json,google-apps-script,google-sheets,Javascript,Arrays,Json,Google Apps Script,Google Sheets,所以我有一个脚本(GoogleApps脚本),它从我的一张工作表(成对:缩写和百分比)中提取数据,这些数据的值是不断变化的(有时是每周的,有时是每天的) 它应该检查旧值和新值,并且只处理新值,但出于某种原因,它正在处理所有值 在循环过程中,它首先查找附加到该单元格的电子邮件,然后向此人发送生成的电子邮件。然后在最后,它存储在上一个数据库中找到的新值 获取新数据和变量 var data = dataRange.getValues(); // Fetch values for each row in
var data = dataRange.getValues(); // Fetch values for each row in the Range.
var oldData = [{}];
//Declare variable
从文档属性获取旧数据
var oldValues = PropertiesService.getDocumentProperties().getProperties();
//get values from document properties
var outerArrayOldData = [];
//empty array
var arr4 = [];
//empty array
var thisLoopString,
thisRowArray;
for (var key in oldValues) {
//grabbing keys from document properties 'row[i]' and loop for each
thisLoopString = oldValues[key];
thisRowArray = []; //Reset
array
thisRowArray = thisLoopString.split(","); //Convert the string to partial array
arr4.push(thisRowArray); //Push the inner array into the outer array
outerArrayOldData = arr4.concat(outerArrayOldData); //convert outer to actual usable array
var arr4 = []; //reset arr4 back to 0
};
//End getting old data
var objOldData = {};
//empty
var keyName = "",
//empty
thisRowArray;
for (i = 0; i < data.length; i++) {
keyName = "row" + (i).toString();
//set keys
thisRowArray = data[i].toString();
//convert each pair array to string
if (thisRowArray == "") continue;
//skip blanks
objOldData[keyName] = thisRowArray;
//add keys and values to properties as a string
}
PropertiesService.getDocumentProperties().setProperties(objOldData,
true); //true deletes all other properties
//Store the Updated/New Values back to Properties
}
将旧数据与新数据进行比较
var oldData = outerArrayOldData;
var source = oldData.map(function (row) {
return JSON.stringify(row);
//map array to string
}),
searchRow,
dataLength = data.length;
for (i = 0; i < dataLength; i += 1) {
searchRow = JSON.stringify(data[i]);
if (source.indexOf(searchRow) == -1) {
//search old data and compare to new data using index search and if data isn't in old stack process it through functions
//doing stuff with new pairs
}
}
}
}
var oldData=outerArrayOldData;
var source=oldData.map(函数(行){
返回JSON.stringify(行);
//将数组映射到字符串
}),
searchRow,
dataLength=data.length;
对于(i=0;i
如何将旧数据存储到文档属性
var oldValues = PropertiesService.getDocumentProperties().getProperties();
//get values from document properties
var outerArrayOldData = [];
//empty array
var arr4 = [];
//empty array
var thisLoopString,
thisRowArray;
for (var key in oldValues) {
//grabbing keys from document properties 'row[i]' and loop for each
thisLoopString = oldValues[key];
thisRowArray = []; //Reset
array
thisRowArray = thisLoopString.split(","); //Convert the string to partial array
arr4.push(thisRowArray); //Push the inner array into the outer array
outerArrayOldData = arr4.concat(outerArrayOldData); //convert outer to actual usable array
var arr4 = []; //reset arr4 back to 0
};
//End getting old data
var objOldData = {};
//empty
var keyName = "",
//empty
thisRowArray;
for (i = 0; i < data.length; i++) {
keyName = "row" + (i).toString();
//set keys
thisRowArray = data[i].toString();
//convert each pair array to string
if (thisRowArray == "") continue;
//skip blanks
objOldData[keyName] = thisRowArray;
//add keys and values to properties as a string
}
PropertiesService.getDocumentProperties().setProperties(objOldData,
true); //true deletes all other properties
//Store the Updated/New Values back to Properties
}
var objoldata={};
//空的
var keyName=“”,
//空的
该行数组;
对于(i=0;i
记录器控制台:
<<<<<<<<Imported Range data>>>>>>>>
[[BBB, 0.9], [CCC, 0.76], [DDD, 0.89], [, ]]
<<<<<<<<Old data from dpcument properties>>>>>>>>
[[DDD, 0.89], [, ], [BBB, 0.9], [CCC, 0.76]]
<<<<<Processing New Values Not in Old Data>>>>>
[CCC, 0.76]
[BBB, 0.9]
[DDD, 0.89]
<<<<<<<<Store the Updated/New Values back to Properties>>>>>>>>
{row1=CCC,0.76, row0=BBB,0.9, row3=,, row2=DDD,0.89}
[BBB,0.9],[CCC,0.76],[DDD,0.89],]
[DDD,0.89],[BBB,0.9],[CCC,0.76]]
[CCC,0.76]
[BBB,0.9]
[DDD,0.89]
{row1=CCC,0.76,row0=BBB,0.9,row3=,row2=DDD,0.89}
正如您所看到的,它仍然在处理所有的值,即使它们不是新的并且已经存在于系统中。为什么搜索没有发现它们已经存在?我在这方面哪里出错了?我理解您的代码有困难,所以我创建了自己的代码:
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var data = {};
function getData() {
var range = sheet.getRange("A1:B3");
var values = range.getValues();
for (var i=0; i < values.length; i++) {
var key = 'row' + i;
var currentRow = values[i];
// for each cell value,
// toString : convert to string
// trim : remove all whitespaces from both ends of cell values
// encode… : encode the values so we don't have any ","
var arr = currentRow.map(function(v){return encodeURIComponent(v.toString().trim())});
// join the array with "," delimiter
var s = arr.join();
data[key] = s;
}
} // getData()
function saveData() {
getData();
PropertiesService.getDocumentProperties().setProperties(data);
}
function compareData() {
getData();
var props = PropertiesService.getDocumentProperties().getProperties();
for (var idx in props) {
if (idx in data) {
if (data[idx] != props[idx]) {
Logger.log('\n%s is different\nOld value is "%s"\nNew value is "%s"',
idx,
decodeURIComponent(props[idx]),
decodeURIComponent(data[idx]));
}
} else {
Logger.log('missing row: ' + idx);
}
}
}
// Test function. Check all document properties
function peekProperties() {
var props = PropertiesService.getDocumentProperties().getProperties();
for (var idx in props) {
Logger.log('%s = %s', idx, props[idx]);
}
}
var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Sheet1”);
变量数据={};
函数getData(){
var范围=sheet.getRange(“A1:B3”);
var values=range.getValues();
对于(变量i=0;i
问题:如果删除了一行怎么办?键不应该是列中的值而不是行号吗?在循环代码的“比较旧数据和新数据”中,尝试更改:
searchRow = JSON.stringify(data[i]);
致:
这可确保第二个数组索引处的值始终转换为字符串,以便与“旧”导入值进行比较,后者似乎是从作为字符串传递的行中解析出来的
当前,它看起来像是用第二个值声明的新数据数组值(或者可能是null或空值):
“旧”行(从Google doc导入)导入并转换为数组,其中值为字符串:
[["CCC","0.76"],["BBB","0.9"],["",""],["DDD","0.89"]]
例如,在将行与JSON.stringify进行比较时,“[“DDD”,“0.89”]”与“[“DDD”,0.89]”不匹配,因此所有行都被错误地注册为“new”
我从您的示例中进行了一些猜测,得出了这个结论,但这可能是您的bug的原因。祝你好运 如果您将问题减少到演示所需的最低限度,可能会有所帮助。发布超过100行的未注释代码会给那些可能想回答的人带来困难。@RobG我删除了我确信不会引起问题的内容,并添加了更多的评论…关于“演示它所需的最小值”,请参阅以了解更多详细信息。别忘了包括一个“旧数据”的示例。@Ruben这就是为什么我包括记录器控制台输出。记录器控制台输出在我看来太杂乱了,所以我没有注意它。对不起,砰!非常感谢。我甚至没有看到这种差异。这个小小的变化完美地修复了它。现在它100%工作,10/10运行完美。