我的编码经验非常有限,在谷歌应用程序脚本方面更是如此。我已经有了一个带有一些功能的脚本,我已经从论坛上整理好了。。。对我来说,下一步是(如果可能的话)对某一列中的每一行执行-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 | |
---|---|
2 | 1 |
10 | 9 |
16 | 15 |
14 | 13 |
16 | 15 |
14 | 13 |
12 | 11 |
9 | 8 |
4 | 3 |
17 | 16 |
19 | 18 |
2 | 1 |
8 | 7 |
12 | 11 |
7 | 6 |
12 | 11 |
7 | 6 |
4 | 3 |
11 | 10 |
7 | 6 |
说明:
你的描述有两种不同的解释,因此我提供了两种解决方案,这样你就可以选择最适合你的。
每次迭代后,您都需要检查上面一行中的值,但上一行的值可以是原始值(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