首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >值减去每一行的1

值减去每一行的1
EN

Stack Overflow用户
提问于 2021-08-26 15:55:26
回答 2查看 62关注 0票数 0

我有非常有限的编码经验,甚至更少的谷歌应用程序脚本。我已经有了一个有一些功能的脚本,我已经把它放在论坛上了.对于我来说,下一步将是(如果可能的话)在某一列中对每一行执行-1 (例如,假设我的值在C列中)。

具体地说:

如果该行的值高于上面的行,则为

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

以上的行值。

因此,如果列C具有以下值:5 5 5 3 3 3 1 2 2

输出应为5 4 3 2 1 3 1 1 1

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

代码语言:javascript
运行
复制
function copytestdata() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Output');
  sheet.getRange("B2:B").copyTo(sheet.getRange("C2:C"), {contentsOnly:true});
 }

如果你知道如何做G应用程序的话,可能很容易制作。谁能帮上忙:)?

EN

回答 2

Stack Overflow用户

发布于 2021-08-26 18:17:56

解释:

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

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

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

代码语言:javascript
运行
复制
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列的原始值

代码语言:javascript
运行
复制
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,依此类推。

票数 0
EN

Stack Overflow用户

发布于 2021-08-26 20:28:30

谢谢你们的回复!

实际上我已经设法想出了一个解决方案。现在我明白了,我的解释可能是错误的,因为我最终为我想要的结果做了一个IF,上面的值是= 1,而不是我在这个案例中声明的IFs。

我的代码很可能与最佳实践相去甚远,而且在许多方面可能会被压缩,但它似乎正在起作用。所以这就是我想出来的:

代码语言:javascript
运行
复制
  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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68941795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档