【问题标题】:How to shift down cells without removing formula when meeting conditions满足条件时如何在不删除公式的情况下下移单元格
【发布时间】:2020-02-09 04:18:29
【问题描述】:

我是一个非常环保的开发人员,我试图在带有谷歌应用脚​​本的谷歌表格中制作一个库存交易程序。我在仓库工作,我正在努力使我的工作和操作运行得比当前系统更好(每个月的实物盘点)。

有 3 个单元格用于手动输入(SKU、类型/原因、数量),当所有 3 个单元格都填写完毕后,第 4 个单元格会自动生成时间戳。

填写完所有 4 个单元格后,我希望程序搜索正确的 SKU(所有这些都是唯一的 #'d),然后通过 + 或 - 更新数量。

我也在考虑减少 +-QTY 上的输入错误,因此可能会考虑让 Reason 确定它是否为 +/-。

例如。类型 = S = 已售出 = - 例如。类型 = N = 新单位 = +

库存排列在谷歌表格上,代表 SKU 在货架/货架上的物理位置。

我希望程序也将该行向下移动 1 行以留下库存交易历史记录。

enter code herefunction onEdit(e) { var activeSheet = e.source.getActiveSheet(); var range = e.range;

range = (obj1,obj2,obj3,obj4)
range[0] = obj1
range[0].getvalue = obj1.getvalue
range[1] = obj2
range[1].getvalue = obj2.getvalue
range[2] = obj3
range[2].getvalue = obj3.getvalue
range[3] = obj3
range[3].getvalue = obj4.getvalue

var var1=range[0].getvalue()
var var2=range[1].getvalue()
var var3=range[2].getvalue()
var var4=range[3].getvalue()

if var1<>"" and var2<>"" and var3<>"" and var4<>"")
var sheet = SpreadsheetApp.getActive()
sheet.getRange("C13:F13").moveto(sheet.getRange("D13:F13")

}

【问题讨论】:

  • 欢迎来到 StackOverFlow,请借此机会参加 tour 并学习如何使用 How to Askminimal reproducible example。你的问题有点笼统。显然你仍处于设计阶段,不知道你要去哪里。此外,我们的目标不是为您编写代码,而是帮助您学习自己编写代码。所以通常我们喜欢看看你自己做了什么。您提供的代码并不真正满足minimal reproducible example 的要求。它不是一个完整的功能。它的格式不正确,如果保存在 Google 脚本编辑器上会产生错误。

标签: javascript google-apps-script google-sheets inventory-management


【解决方案1】:

我玩了一下这个。我知道您希望将单元格向下移动,但我发现将 SKU、类型、数量和时间戳向右移动更容易,以便在电子表格上保留交易日志。

因此,希望这能让您深入了解如何以自己的方式自己做到这一点。

代码如下:

这是一个 onEdit() 函数(即简单触发器)

function onEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!='Sheet1')return;
  var rg=sh.getRange(1,2,3,1);
  var vA=rg.getValues().map(function(r){return r[0];});
  var sku=vA[0];
  var type=vA[1];
  var quan=vA[2];
  e.source.toast(sku + ',' + type + ',' + quan);
  SpreadsheetApp.flush();
  if(e.range.columnStart==2 && e.range.rowStart<5 && sku && type && quan) {
    sh.getRange("B4").setValue(Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyyMMddHHmm"));
    var sh2=e.source.getSheetByName('Sheet2');
    var rg2=sh2.getDataRange();
    var luA=rg2.getValues();
    for(var i=1;i<luA.length;i++) {
      if(luA[i][0]==sku) {
        if(type=='Sold') {
          //sh.getRange(3,2).setValue(Number(luA[i][2]-quan));
          sh2.getRange(i+1,3).setValue(Number(luA[i][2]-quan));
          e.source.toast('Sold');
        }
        if(type=='New') {
          //sh.getRange(3,2).setValue(Number(luA[i][2]+quan));
          sh2.getRange(i+1,3).setValue(Number(luA[i][2]+quan));
          e.source.toast('New');
        }
        sh.insertColumnAfter(2);  
        sh.getRange(1,3,4,1).setValues(sh.getRange(1,2,4,1).getValues())
        sh.getRange(1,2,4,1).clearContent();
      }
    }
  }
}

这就是我的 Sheet1 和 Sheet2 的样子。 Sheet2 中的每个项目都以 100 开头。

表 1:

表 2:

如果您从未使用过 onEdit(e) 函数,则 e 是一个参数,用于保存来自事件对象的数据,当您获得事件触发器时该对象会被加载。所以你不能从脚本编辑器运行这个函数。您必须复制它并通过填写 SKU、类型和数量的值在第 2 列中进行适当的编辑。

希望这个示例能让您深入了解如何进行操作。

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多