繁体   English   中英

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

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

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

例如,以下是工作表中的前几个单元格:

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

单元格C5:显示AMOUNT C

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

单元格E5:显示AMOUNT E

请参阅此附加示例。 将值添加到黄色单元格,并在每个黄色单元格上方描述它们需要对相邻单元格执行的操作。

一些例子:

  1. 将数字5添加到单元格B5中需要将C5的值从72更改为77,然后需要清除B5。

  2. 将数字12加到J6需要将I6的值从36更改为24,将K6的值从无更改为12,然后需要清除J8。

  3. 将数字32添加到R5需要将Q5的值从41更改为9,将S5的值从1更改为3,然后需要清除R5。

  4. 在单元格V6中添加数字5需要将U6的值从5更改为空,然后需要清除V6。

我更喜欢使用公式,因为我可以通过转到文件/电子表格设置/计算并将最大迭代次数更改为1(阈值为0.05)来避免循环引用错误,所以我可以在单元格中使用= C5 + B5这样的公式C5。 是否可以添加此公式,以便在将B5的值添加到C5之后清除B5? 然后我该如何添加从C5中减去在D5中输入的值,然后再清除D5的功能?

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

我认为您需要此onEdit()触发器 另请参阅关于Apps脚本Spreadsheet App的文档。

例如,在工作表中,需求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表格的保护功能可能会派上用场。


评论:

尝试创建一个不依赖于每次编辑更改的其他界面。 您很容易遇到同步问题。 不需要很多投入的最终工作表可能没问题。 但是,它会减慢您的常规活动。

同样,您可能应该有一个显示最新编辑的单元格。


编辑:关于推广代码并应用上述示例,您可以执行以下操作:

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将需要以下功能。 请注意,用户输入可能偶然是非数字的。

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)

}

如前所述,最好将您正在观看的单元格的索引从另一张表中提取出来-反对对数字5、3、2进行硬编码。要为所有方案实现完整的解决方案,您只需遍历您需要通过update方法观看的所有单元,然后遍历所有可能的update方法。

您确实需要自己实现确切的代码。 在Stackoverflow上,我们仅讨论方法及其工作方式。 我们使用最少的独立实例进行讨论。 我们无法编写代码来完成人们的项目。 那将不是一种可持续的互动方式。

从该答案中可以获取的目标是各种应用程序脚本实用程序,并通过示例代码和有关泛化的建议进行了链接和描述。 而已。 如果对实用程序有疑问,请阅读链接的文档。 如果之后仍然有疑问,请打开另一个具有特定重点的帖子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM