每行IF的值减1



我的编码经验非常有限,在谷歌应用程序脚本方面更是如此。我已经有了一个带有一些功能的脚本,我已经从论坛上整理好了。。。对我来说,下一步是(如果可能的话)对某一列中的每一行执行-1(例如,假设我的值在C列)。

具体而言:

  • 如果此行的值高于上一行:保留该值并跳到下一行。或
  • 如果this的值=1:也保留该值并跳到下一行
  • 否则,我希望它执行-1以上行的值

因此,如果列C具有以下值:5.5.5.5.5.3.3.3.1.2.2

输出应该是5.4.3.2.1.3.2.1.1.2.1

它可以从C3开始,因为C1是一个标题,C2也应该保持原样。是的,它可以完全覆盖C列中的数据,因为它已经是B列的副本了,我用这个小代码完成了:

function copytestdata() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Output');
sheet.getRange("B2:B").copyTo(sheet.getRange("C2:C"), {contentsOnly:true});
}

如果你知道如何使用G应用程序,可能很容易制作。。有人可以帮忙吗:)?

您可以这样做。我没有做你所有的条件句,但我想你会想自己弄清楚的。

function copytestdata() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Output');
const vs = sh.getRange(2,2,sh.getLastRow() - 1).getValues();
let vo = vs.map((r,i) => {
//I just subtracted one
if(r[0] > 1) {
return [r[0] - 1];
}
})
sh.getRange(2,3,vo.length,vo[0].length).setValues(vo);
}

COL2是我的数据,COL3是我的输出

COL2
21
109
1615
1413
1615
1413
1211
98
43
1716
1918
21
87
1211
76
1211
76
43
1110
76

说明:

你的描述有两种不同的解释,因此我提供了两种解决方案,这样你就可以选择最适合你的。

每次迭代后,您都需要检查上面一行中的值,但上一行的值可以是原始值(C列中的值),也可以是在上一次迭代中计算的值

解决方案1-上一次迭代中计算的上面一行的值:

function copytestdata() {
const ss = SpreadsheetApp.getActive();
const sheet = ss.getSheetByName('Output');
const vs = sheet.getRange("C3:C"+sheet.getLastRow()).getValues().flat();
const res = [[vs[0]]];
let temp;
for(i=1;i<vs.length;i++){
temp = vs[i]>res[i-1] || vs[i]==1 ? vs[i] : res[i-1]-1;
res.push([temp]);
}
sheet.getRange(3,4,res.length,res[0].length).setValues(res);
}

解决方案2-上面一行的值是C列的原始值

function copytestdata() {
const ss = SpreadsheetApp.getActive();
const sheet = ss.getSheetByName('Output');
const values = sheet.getRange("C3:C"+sheet.getLastRow()).getValues().flat();
const res = [];
values.forEach((v,i)=>{
if(i>0){
if(v>values[i-1] || v==1){
res.push([v]);
}
else{
res.push([values[i-1]-1]);
}
}
else{
res.push([v]);
}
})
sheet.getRange(3,4,res.length,res[0].length).setValues(res);
}

您的示例问题:

在这两种情况下,您提供的示例似乎与您的解释不符。

假设你的序列是5 5 5 5...

根据解决方案2,第一个值是5(因为在5之前没有值),第二个值是4,因为前两个值相等。但其他的也是4,因为你只有5。

如果我们考虑第一个解决方案,那么你的值是5和4,但第三个值是5,因为5大于4,依此类推

谢谢你们的回复!

实际上,我已经设法创建了一个解决方案。我现在明白了,我的解释可能是错误的,因为我最终为我想要的结果所做的是只生成上面一行的值为=1的IF。不是我在案件中所说的国际单项体育联合会。

我的代码可能与最佳实践相去甚远,在很多方面可能会被压缩,但它似乎正在发挥作用。。这就是我想到的:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Output');
sheet.getRange("B2:B").copyTo(sheet.getRange("C2:C"), {contentsOnly:true});
sheet.getRange("C1:C1").setValue("Header");
var colc = "C";  
var rovernr = 2;
var thisnr = 3;
var lastnr = sheet.getLastRow();
var rowabove = colc+rovernr;
var thisrow = colc+thisnr;
var valueabove = sheet.getRange(rowabove).getValue();
var thisvalue = sheet.getRange(thisrow).getValue();
while (thisnr <= lastnr) {
if(valueabove == 1) {
sheet.getRange(thisrow).setValue(thisvalue);
}
else {
sheet.getRange(thisrow).setValue(valueabove-1);
}
rovernr = rovernr+1;
thisnr = thisnr+1;
rowabove = colc+rovernr;
thisrow = colc+thisnr;
valueabove = sheet.getRange(rowabove).getValue();
thisvalue = sheet.getRange(thisrow).getValue();
}

所以对于每一次迭代;手动";在行号上,并为当前行和x上方的行获取新的单元格值)这是输入和输出:

输入2.2.4.4.4.4.1.3.3.3

输出2.1.4.3.2.1.1.3.2.1

最新更新