我正在尝试创建一个在Google电子表格中运行的脚本,该电子表格会在一个电子表格中扫描工作表,找到与我的IF匹配的每一行,然后只将那些匹配的行写入另一个电子表格。 我完全是脚本的新手,但是拼凑了一些东西。 到底是什么,我不确定。 这是一个笨拙的混乱,但我觉得它接近工作。
我遇到的问题:(除了不知道舔javascript):
我觉得它不会搜索整个源表的范围。 它找到第一个真实条件,然后继续将其写入目标表。 过度。并结束。结束。
使用以下相似的结果:
for(n=0;n<data.length;++n){
if (data[n][13]=="yes"&&data[n][16]!="yes"){ ;
target.push(data[n]);
我最终想写一些重复的检查和功能,但想要解决它的问题。
肉:
function test() {
var source = SpreadsheetApp.openById("0A....nc");
var sh = source.getSheetByName("NA");
var data=sh.getDataRange().getValues()
var target=new Array();
for(i=0;i<data.length;++i){
for (j=0;j<data[i].length;++j){
if (data[i][13]=="yes"&&data[i][16]==""){ ;
target.push(data[i]);
}
}
if(target.length>0){
var ss = SpreadsheetApp.openById("0A....Gc");
var sh2=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Sheet5"));
var xx = sh2.getLastRow();
sh2.getRange(xx+1,1,target.length,target[0].length).setValues(target);
}
}
}
感谢任何人提供的任何帮助!
编辑:设法让我的工作完全像我想要的那样。
function testtest() {
var source = SpreadsheetApp.openById("0A....Wc");
var sh = source.getSheetByName("Sheet1");
var data = sh.getDataRange().getValues()
var ss = SpreadsheetApp.openById("0A....mc");
var sh2 = ss.getSheetByName("Sheet1");
var xx = sh2.getLastRow();
var target=new Array();
for(i=0;i<data.length;++i){
if (((data[i][13]=='yes')||(data[i][13]=='YES')||(data[i][13]=='Yes')) && !((data[i][16]=='yes')||(data[i][16]=='YES')||(data[i][16]=='Yes'))){
target.push(data[i]);}
}
var newData=new Array();
for(i in target){
var sh2D = sh2.getDataRange().getValues();
var row = target[i];
var duplicate = false;
for(j in sh2D){
if(row.join() == sh2D[j].join()){
duplicate = true;
}
}
if(!duplicate){
newData.push(row);
}
}
if(newData.length>0){
var dest = sh2.getRange(xx+1,1,newData.length,newData[0].length);
dest.setValues(newData);
}
}
是的,它很草率。 现在正致力于更新新目标表中的单元格并将该更改转换为主列表。实际上,它只是在工作完成时向列添加“是”,然后更新主页(在一张经常被25个人排序的工作表上)。
哦,如果有人知道一种独立于案例或额外空格搜索“是”的方法,它肯定有助于清理我的IF线。
答案 0 :(得分:1)
哦,如果有人知道一种独立于案例或额外空格搜索“是”的方法,它肯定有助于清理我的IF线。
按照你说的做...比较大写值,修剪空格。
if ((data[i][13].trim().toUpperCase() === 'YES') && (data[i][16].trim().toUpperCase() != 'YES')) {
...
如果你需要做很多事情,请创建一个辅助函数:
/**
* Perform case-insensitive, trimmed comparison of two strings.
* Returns true if strings are nominally equal.
*/
function strEqual(str1, str2) {
var one = str1.trim().toUpperCase();
var two = str2.trim().toUpperCase();
return one === two;
}
然后你可以这样做:
if (strEqual(data[i][13],'yes') && !strEqual(data[i][16],'YeS')) {
...