目的是比较两张纸片的价格数据,并在单张名称“列表”中附加输出结果。
步骤一-如图1所示,表名为“Rank”的表范围为Scrip-1和Scrip-2。
步骤II -初始化Scrip 1,并在工作表名“对查找器”'B13‘单元格中设置值。计数器初始值设置为表-1中的工作表名称‘等级’。用计数器I&j进行迭代的基础计算设置
“I”柜台是指“等级”表中的一张表。'j‘计数器是用于“等级”表中的2张表的。
第三步--这将导致在工作表名“协整”中设置值。它们的计算已经完成,输出值被概括为“J2:Q2”范围。将检查这些输出值的条件,如下所示。在单张名“合成”中
第四步-
在最终范围值转移之前,将检查下列条件
步骤V-然后在计算之后,范围值'J2:Q2‘以工作表名“协整”复制到“列表”工作表中,并分别附加到下一个I&j(不超过执行限制)计数器,以满足所有条件。
第六步-为了解决执行时间限制问题,I&J被记录在“B9&D9”中的“结对查找器”中,并用于宏的下一轮运行。
在努力提高效率的同时,我犯了一些错误,导致脚本在最后几步之前完成。
链接到谷歌工作表如下所示。oHLTcT9tmTJPgKVgkGwGWhooBM8uluwmWcC92eOk/edit?usp=sharing
气体代码如下。
function matchnsort() {
var wb = SpreadsheetApp.getActiveSpreadsheet();
var rank = wb.getSheetByName('Rank');
var pf_sheet = wb.getSheetByName('Pair finder');
var checking = wb.getSheetByName('Cointergration');
var list = wb.getSheetByName('List');
var countA = rank.getRange('S9:S'); // Scirp-1 Table Range
var lenA = countA.getDisplayValues().flat().filter(String).length; // Scirp-1 Table length
var countB = pf_sheet.getRange('D13:D'); // Scirp-2 Table Range
var lenB = countB.getDisplayValues().flat().filter(String).length; // Scirp-2 Table length
var rowA = countA.getRowIndex(); // Scrip-1 Starting Row - 1st (scrip-1) to start Macro run `
var rowB = countB.getRowIndex(); // Scrip-2 Starting Row - 1st (scrip-2) to start Macro run
var col1 = countA.getColumn(); // Range identification for Scrip-1
var col2 = countB.getColumn(); // Range identification for Scrip-2
var cellA = pf_sheet.getRange('B9'); // Scrip-1 counter record - for next cycle - execution time limits
var cellB = pf_sheet.getRange('D9'); // counter recording for Scrip-2
var cellAVal = cellA.getDisplayValue(); // Scrip-1 counter initialization
var cellBVal = cellB.getDisplayValue(); // Scrip-2 counter initialization
// Logger.log(cellAVal);
//if(cellAVal === "" || cellBVal === ""){ // setting up Scrip-1 & 2 counter for 1st run
//cellA.setValue(rowA);
cellB.setValue(rowB);
// SpreadsheetApp.flush();
//}
var scrip1 = pf_sheet.getRange('B16'); // Scrip-1 setting Range Value
var scrip2 = checking.getRange('H4'); // Scrip-2 setting Range Value
var rows_lenA = lenA + 9;
var rows_lenB = lenB + 14;
if(cellAVal === ""){ // final Check Scrip-1 values copied to desired cell for 1st run
SpreadsheetApp.flush();
Logger.log(cellAVal);
Logger.log(rowB);
}
else{
for (i=cellAVal; i<rows_lenA; i++){ // Loop-1 for Scirp-1
// set the number i on the sheet into the cell 'Pair finder!B16'
var dataOutRang1 = rank.getRange(i,col1);
var dataOut1 = dataOutRang1.getDisplayValue();
scrip1.setValue(dataOut1);
for (j=cellBVal; j<rows_lenB; j++){ // Loop-2 for Scirp-2
// set the number j on the sheet into the cell 'Coint!H4'
var dataOutRang2 = pf_sheet.getRange(j,col2);
var dataOut2 = dataOutRang2.getValue(); // *** Array Values for appending in 'List' Sheet
Logger.log(dataOut2)
scrip2.setValue(dataOut2);
var dataOutRang3 = checking.getRange('J2:Q2'); // Output Range to be appended & stored
var condition1 = checking.getRange('P2').getDisplayValue(); // Scrip -1
var condition2 = checking.getRange('Q2').getDisplayValue(); // Scrip -2
var condition3 = checking.getRange('J2').getDisplayValue(); // ADF Value
var condition4 = checking.getRange('K2').getDisplayValue(); // KPSS Value
var condition5 = checking.getRange('R2').getDisplayValue(); // Check for Data Repeation
if(scrip1 !== scrip2){
if((condition3 === "Loading" || condition4 === "Loading")){
SpreadsheetApp.flush();
}
else{
if((condition1 !== "no" || condition2 !== "no") && ( condition3 !== "" || condition4 !== "") && condition5 === "TRUE"){
Logger.log(condition1)
Logger.log(condition2)
Logger.log(condition3)
Logger.log(condition4)
var dataOut3 = dataOutRang3.getValues();
dataOut3 = dataOut3.flat();
// Logger.log(dataOut3);
list.appendRow(dataOut3);
}
}
cellB.setValue(j); // Record last j value - to used in next cycle
Logger.log(dataOut3);
}
cellA.setValue(i); // Record last i value - to used in next cycle
}
}
}
}第3行到第7行-定义了电子表格名称的初始引用。
第9行至第12行
第14行到第21行-初始化计数器I& j、行索引和Col号。
第23至28行记录I& j的计数器值。
第30至33行定义了计算设置所需的范围。
第38至42行检查计算和值在相关单元格中,然后再继续。
第44行到第49行开始第一圈的计数器i。
第51至57行开始计数器j的第2st循环。
第59至75行条件放置和检查。
如果条件满足“List”工作表,则第76至79行附加输出数据。
第83至87行记录下一个周期的计数器I&j值。
Pl。建议消除错误和提高效率/运行时。
执行日志按建议附后。样本数据执行日志
发布于 2022-08-14 14:45:27
代码的一个问题是表达式scrip1 !== scrip2,因为它总是返回true,因为这两个变量都分配了类范围对象。在Google脚本/ JavaScript中仅使用原语(1、'hello world'等)可以直接比较。
也许应该用dataOut1 !== dataOut2代替它,因为这个表达式的操作数之上的几行行被用来分别设置scrip1和scrip2的值(Range.setValue())。
相关
https://stackoverflow.com/questions/73343081
复制相似问题