如何在 Google 工作表中将值从一个单元格转移到另一个单元格

How To Transfer A Value From One Cell To Another In Google Sheets

我有一个有趣的情况,我的 Google Sheet 中的每一第二列代表各个站点的项目数量。我想要完成的是在这些列之间的单元格中输入转移值时自动调整这些值的数量。

例如,这里是 sheet 上的前几个单元格:

B5单元格:此处输入的数据应添加到C5中的值,然后清除

单元格 C5:显示金额 C

单元格 D5:此处输入的数据应从 C5 中的值中减去,添加到 E5 中的值,然后清除

单元格 E5:显示金额 E

See this attached example. 值被添加到黄色单元格,并且它们需要对其相邻单元格执行的操作在每个单元格上方都有描述。

一些例子:

  1. 在B5单元格中加入数字5需要将C5的值由72改为77,然后B5需要清零

  2. J6加上数字12需要将I6的值由36变为24,K6的值由无变为12,然后J8需要清零

  3. R5加上数字32需要将Q5的值由41变为9,S5的值由1变为3,然后R5需要清零

  4. 将数字5加到Cell V6需要把U6的值从5改成nothing,然后V6需要清零

我更喜欢使用公式,因为我可以通过转到 File/Spreadsheet Settings/Calculation 并将最大迭代次数更改为 1(阈值为 0.05)来避免循环引用错误,我可以使用像单元格 C5 中的 =C5+B5 这样的公式。有没有办法在这个公式中添加,使得B5在其值添加到C5后被清除?然后我如何添加从 C5 中减去 D5 中输入的值的功能,然后将 D5 也清除?

有人有什么想法吗?将不胜感激!

我觉得这个onEdit() trigger is what you need. Also see the documentations on Apps Script and Spreadsheet App.

例如,在您的 sheet 中,要求 1 的实现可以如下所示。

function onEdit(e) {
   var sheet = SpreadsheetApp.getActiveSpreadsheet();
   var tab = sheet.getSheetByName('Item Transferring');
   sheet.setActiveSheet(tab); \<---
   var cell = e.range;
   user_input = cell.getValue();
   if (cell.getRow() == 5 && cell.getColumn() == 2){ \ it's probably best that you read the row and column indices of B5 and C5 from a helper tab/sheet in case you decide to move B5 and C5 later. 
      var cell2 = tab.getRange(5,3);
      cell2.setValue(cell2.getValue()+user_input);
      cell.clear({contentsOnly: true});
      SpreadsheetApp.setActiveRange(cell); \<--- use this in conjunction with setActiveSheet. Either use both or use neither.
   }       
}

为onEdit函数设置一个onEdit触发器,就会出现想要的效果

请注意,在您的方案中,编辑始终针对单个单元格。有时,可以同时对多个单元格进行编辑。确保您的界面没有歧义。另外 Google Sheet 的保护功能可能会派上用场。


评论:

请尝试创建一个不同的界面,让您不那么依赖更改 per edit。您很容易 运行 遇到同步问题。不经常需要大量输入的最终 sheet 可能没问题。尽管如此,它还是会减慢您的日常活动。

此外,您可能应该有一个显示最近编辑的单元格。


编辑:关于概括代码和应用上面的例子,你可以这样做:

function process_input(row_input,col_input,input,output,func){
  // row_input and col_input are the cell indices you are watching
  // input is the range object that the edit trigger passes in
  // output is the range object that contains the cell you want your edit to happen to
  // func contains the formula you want in the output cell

   if (input.getRow()==row_input,input.getColumn()==col_input){
      output.setValue(func(input,output));
      input.clear({contentsOnly: true});      
   }
}

作为一个可以应用于您的其余问题的示例,您之前的场景 1 需要如下函数。请注意用户输入可能会意外 non-numeric.

function update_add(input,output){
    if (!isNaN(input.getValue()) && isFinite(input.getValue()){
       return input.getValue()+output.getValue()
    }else{
       return output.getValue()
    }
}

你可以为你想要的每一种更新编写一个像上面这样的简单函数。综上所述,以您的场景 1 为例,即监控 B5 并使用添加配方更新 B6,您会做

function onEdit(e){

...

   output = tab.getRange(5,3);
   process_input(5,2,e.range,output,update_add)

}
  

如前所述,最好从单独的 sheet 中提取正在观看的单元格的索引——而不是对数字 5、3、2 进行硬编码。实施完整的解决方案对于所有场景,您可以简单地通过更新方法遍历所有需要监视的单元格,然后遍历所有可能的更新方法。

You do need to implement the exact code yourself. On Whosebug, we only discuss methods and how they work. We discuss using minimally self-contained examples. We can't hand codes to complete people's projects. That won't be a sustainable kind of interaction.

The intended take-away for you from this answer are the various Apps Script utilities linked and described with sample codes and the advices on generalization. That's it. If there are questions about a utility, please read the linked documents; and if you still have questions after, open another post with a specific focus.