我有非常有限的编码经验,甚至更少的谷歌应用程序脚本。我已经有了一个有一些功能的脚本,我已经把它放在论坛上了.对于我来说,下一步将是(如果可能的话)在某一列中对每一行执行-1 (例如,假设我的值在C列中)。
具体地说:
如果该行的值高于上面的行,则为
以上的行值。
因此,如果列C具有以下值:5 5 5 3 3 3 1 2 2
输出应为5 4 3 2 1 3 1 1 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应用程序的话,可能很容易制作。谁能帮上忙:)?
发布于 2021-08-26 18:17:56
解释:
您的描述有两个不同的整数,因此我提供了两个解决方案,这样您就可以选择最适合您的方案。
每次迭代之后,您需要检查上面行中的值,但上一行中的值可以是原始值(列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,因为你只有5s。
如果我们考虑第一个解,那么您的值是5和4,但是第三个值是5,因为5大于4,依此类推。
发布于 2021-08-26 20:28:30
谢谢你们的回复!
实际上我已经设法想出了一个解决方案。现在我明白了,我的解释可能是错误的,因为我最终为我想要的结果做了一个IF,上面的值是= 1,而不是我在这个案例中声明的IFs。
我的代码很可能与最佳实践相去甚远,而且在许多方面可能会被压缩,但它似乎正在起作用。所以这就是我想出来的:
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();
}因此,对于行号上的每一次迭代i“手动”,并为当前和x上的行获取新的单元格值),这是输入和输出:
输入2 2 4 4 4 1 3 3
输出2 1 4 3 2 1 1 3 2
https://stackoverflow.com/questions/68941795
复制相似问题