如何使用变量来避免为工作表中的所有列创建一组变量?

2024-03-13

当单元格更改时,我试图让我的工作表在两个方向上自动重新计算计划内的一组日期。

该代码工作正常,但我需要添加更多列,而且我真的不想多次复制/粘贴/查找/替换负载。我相当确定我可以使用变量来做到这一点(只需查找列标识符并以某种方式将其输入代码中),但我不知道如何操作。

functJon onEdJt(e) {

var sh = e.source.getActJveSheet();
Jf(sh.getName() === 'Date Calculator' && e.range.getA1NotatJon() === 'C9' 
) 
{
sh.getRange("C10").setFormula("=WORKDAY(C9,+$C$3)");
sh.getRange("C11").setFormula("=WORKDAY(C10,+10)");
sh.getRange("C12").setFormula("=WORKDAY(C11,+$C$4)");
sh.getRange("C13").setFormula("=WORKDAY(C12,+$C$3)");
sh.getRange("C14").setFormula("=WORKDAY(C13,+10)");
sh.getRange("C15").setFormula("=WORKDAY(C14,+1)");
sh.getRange("C16").setFormula("=WORKDAY(C15,+$C$5)");
}
else Jf (sh.getName() === 'Date Calculator' && e.range.getA1NotatJon() 
=== 'C10' ) 
{
sh.getRange("C9").setFormula("=WORKDAY(C10,-$C$3)");
sh.getRange("C11").setFormula("=WORKDAY(C10,+10)");
sh.getRange("C12").setFormula("=WORKDAY(C11,+$C$4)");
sh.getRange("C13").setFormula("=WORKDAY(C12,+$C$3)");
sh.getRange("C14").setFormula("=WORKDAY(C13,+10)");
sh.getRange("C15").setFormula("=WORKDAY(C14,+1)");
sh.getRange("C16").setFormula("=WORKDAY(C15,+$C$5)");

理想情况下,代码应该只适用于工作表中任意数量的列,因此如果添加更多列,我不需要添加更多代码。

Update这是我正在尝试的示例(但它不起作用) - 在运行“set.Formula”函数之前尝试检查活动单元格是否位于特定列的第 9 行:

function onEdit(e) {

  var sh = e.source.getActiveSheet();
  var col = e.source.getActiveSheet().getRange().getColumn();
  var row = e.source.getActiveSheet().getRange().getRow();

  if(sh.getName() === 'Date Calculator' && e.getRange('9',col)     ) 

事件对象
即使代码写为 onEdit(e),您也没有利用事件对象。 在此答案中,代码返回已编辑单元格的新值以及范围。然后,该范围用于计算行、列和工作表名称,这些名称用于验证以及构建范围和工作表setFormula

变量
该代码包括可用于数据输入的有效列范围的变量(C 列到 H 列)以及相应的输入行(第 9 行和第 10 行)。这些被表示为值,但它们可以像假设一样轻松地写入电子表格,并且通过使用在代码中获得的值getValue.
中使用的绝对单元格引用setFormula部分是可变的(列引用),部分是硬编码的(相应的行 3,4 和 5)。如果需要,行也可以是可变的。

效率
只有一个if包含要构建的代码的一个版本的语句setFormula。 这是通过设计实现的if陈述:
1. 如果工作表=“日期计算器”并且
2. 如果 editColumn 位于有效的 ColumnStart 和 ColumnEnd 值之间(C 列到 H 列)并且
3. 如果 editRow 位于有效行值之间(第 9 行或第 10 行)并且
4. 如果编辑的值不是空白(长度!= 0)。

最后一个条件(“编辑的值为空”)确保如果单元格内容被删除(和/或没有值),则代码将不会继续。

将列号转换为字母
我使用了 @AdamL 编写的例程,位于将列索引转换为对应的列字母 https://stackoverflow.com/a/21231012/1330560;这会将列号转换为字母。它用于构建“目标列”地址Workdays。它对字母 A-Z 有效;有一个版本适用于 Z 以外的字母。

Cleanup
如果数据输入到给定列的第 10 行,则需要删除第 9 行(同一列)中的任何值。该代码执行此操作,并删除下面行中任何预先存在的公式日期,因此不会对数据输入派生的日期产生混淆。


function onEdit(e){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetname = "Date Calculator";
  var sheet = ss.getSheetByName(sheetname);

  // get the event source data
  var editedCell = e.range;
  var editRow = editedCell.getRow();
  var editCol = editedCell.getColumn();
  var eValue = e.value;
  var editedSheet = editedCell.getSheet().getName();
  //Logger.log("DEBUG: the cell = "+editedCell.getA1Notation()+", the column = "+editCol+", the row is "+editRow+", the value is "+eValue+", the edited sheet is "+editedSheet);

  // create some variables for column and row range
  var columnStart = 3; // Column C
  var columnEnd = 8; // Column H
  var rowOption1 = 9; // row 9
  var rowOption2 = 10 // row 10

  // create some variables for target cells
  var absolutecolumn = "C";
  //var absoluterow1 = 3; // not used
  //var absoluterow2 = 4; // not used
  //var absoluterow3 = 5; // not used

  // test for valid edit in row option 1 // Row 9
  if(editedSheet === sheetname && columnEnd >=editCol && editCol>=columnStart && rowOption2>=editRow && editRow>=rowOption1 && eValue.length !=0 ){

    //Logger.log("DEBUG: You got the right sheet, the edit is in the right range of columns and the edited row was =  "+rowOption1);

    if (editRow == rowOption2){
    // clear row 9
    sheet.getRange((+editRow-1),editCol).clear();
    } 

    // clear following 8 rows of data
    sheet.getRange((+editRow+1),editCol,8).clear();

    // set the targetcolumn as a letter
    var targetcolumn = columnToLetter(editCol);

    // set formula for row+1
    sheet.getRange((+editRow+1),editCol).setFormula("=WORKDAY("+targetcolumn+editRow+",$"+absolutecolumn+"$3)"); // 
    // set formula row +2
    sheet.getRange((+editRow+2),editCol).setFormula("=WORKDAY("+targetcolumn+(+editRow+1)+",+10)");
    // set formula row +3
    sheet.getRange((+editRow+3),editCol).setFormula("=WORKDAY("+targetcolumn+(+editRow+2)+",$"+absolutecolumn+"$4)");
    // set formula row +4
    sheet.getRange((+editRow+4),editCol).setFormula("=WORKDAY("+targetcolumn+(+editRow+3)+",$"+absolutecolumn+"$3)");
    // set formula row + 5
    sheet.getRange((+editRow+5),editCol).setFormula("=WORKDAY("+targetcolumn+(+editRow+4)+",+10)");
    // set formula row + 6
    sheet.getRange((+editRow+6),editCol).setFormula("=WORKDAY("+targetcolumn+(+editRow+5)+",+1)");
    // set formula row + 7
    sheet.getRange((+editRow+7),editCol).setFormula("=WORKDAY("+targetcolumn+(+editRow+6)+",$"+absolutecolumn+"$5)");

    // change the background to show entry in rowoption1
    sheet.getRange(editRow,editCol).setBackground("yellow");
    sheet.getRange((+editRow+1),editCol).setBackground("white");
  } 
}
function columnToLetter(column)
{
  var temp, letter = '';
  while (column > 0)
  {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

Screenshot
Screenshot

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用变量来避免为工作表中的所有列创建一组变量? 的相关文章

  • 复制电子表格也会复制所有链接的文件

    当我使用库方法时 我希望能够仅复制电子表格及其所有工作表以及所有定义的工作表名称 spreadSheet copy newSSName Or myFile makeCopy newNameOfFile 目前 这些方法复制所有链接的表单和表单
  • 如何使用 OnChange() 触发器

    我有一个电子表格以及该电子表格的主副本 每次用户将数据输入单元格时 它都会获取新数据并放入主副本中 然而最近 我注意到一个用户创建了一个新列 该列未被 OnEdit 捕获 于是我查了一下 看到了去年实现的OnChange 但是 我不知道如何
  • 指向特定工作表的超链接

    我想从另一个电子表格中的超链接打开 Google 表格的特定工作表 我的主电子表格中有不同的链接 每个链接都应该有一个指向同一从属电子表格但指向不同工作表的超链接 我知道超链接功能 但它不会转到特定的工作表 您可以使用此自定义脚本 工具 g
  • 谷歌表格根据今天的日期隐藏行

    在 Google Sheets 中 当 A 列中的日期等于或早于今天的日期时 我需要一个脚本来自动隐藏工作表 1 中的行 因此 如果今天是 2018 年 8 月 29 日 单元格 A3 中的日期是 2018 年 8 月 28 日 则第 3
  • 创建具有动态更新变量的数组

    我有一些 PHP 变量 它们的名称直接链接到它们包含的函数 是否有办法自动创建这些变量 以便我可以使用所有变量 00 200 这就是我现在正在做的事情 regdays00 is user reg matured 00 regdays02 i
  • Drive.Permissions.insert(值)-Drive API,您可以在“值”下使用数组吗?

    是否可以在此处使用 值 下的数组来阻止我创建组别名电子邮件地址 例如 userValues email protected cdn cgi l email protection email protected cdn cgi l email
  • 用于创建文件夹的应用程序脚本无法在共享驱动器中运行

    谷歌应用程序脚本新手在这里 我发现这段代码可以帮助使用 Google Sheet 中的输入在我的个人 Google Drive 中创建文件夹 来源 Youtube 上的 Google Sheet Community 但是 当我尝试在共享的
  • 谷歌电子表格中的“MMMM yy”日期

    我有一个谷歌电子表格 其中我想要一个仅包含月份和年份名称的日期 例如September 2011 而且我还希望月份和年份能够轻松更改 有没有办法获得自定义日期格式来做到这一点 我发现我可以这样做 TEXT 40295 MMMM yy 但是日
  • 使用 Promise 对 Google 表格进行多次查询

    我是一名初学者编码器 需要一些帮助来加快我的 Google 表格查询速度 我环顾四周 找不到解决方案 我正在尝试快速对 Google 表格运行 25 个查询 这就是我的尝试方式 对 Google 工作表运行查询 将结果推送到数组 运行不同的
  • 不明白为什么当变量为整数时条件评估为 True

    我正在使用表现出以下行为的代码 假设我有一个变量d我把它赋给一个整数9 d 9 为什么以下语句有效 In 95 if d print d else print Did not print d 9 In 96 当 d 本身不是布尔值且未通过以
  • Google Apps 脚本:比较日期

    我在比较 Google Apps 脚本中的日期时遇到了一个奇怪的问题 为此 我的工作表在 cell getValue 中有一个日期 所以 e range setNote cell getValue startDate 行中 注释显示两个看起
  • 如何像函数一样使用 google.script.run

    在 Google Apps 脚本中 我有以下脚本 function doGet return HtmlService createHtmlOutputFromFile mypage function writeSomething retur
  • 如何使用基于时间的触发器每小时运行一个脚本,仅在工作日的整点运行?

    我只需要在工作日每小时运行一个 Google App Script 脚本 两者之一似乎很容易做到 但将其结合起来我不确定 每小时触发 ScriptApp newTrigger RefreshRates timeBased inTimezon
  • 当 Google 任务标记为“已完成”时如何触发 Google 脚本

    Google Apps 脚本允许由各种事件触发脚本 看here https developers google com apps script guides triggers 当用户将任务标记为已完成 在 Google 任务中 时 我想更新
  • 如何在Google工作表中添加类似于Excel中的表单控件滚动条的水平滚动条?

    我想添加一个水平滚动条 它将根据其位置提供 0 365 的值 并使用该值进行计算 我正在创建一个甘特图 与页面上的相同https www vertex42 com ExcelTemplates excel gantt chart html
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 单击按钮时增加 ASP.net 中的变量

    我是 ASP NET 新手 我正在使用 VB net 创建一个 ASP net 网站 所以这是我的问题 Dim myCounter as Integer 0 Protected Sub Button1 Click ByVal sender
  • 在 C++ 的 if-else 块中声明变量

    我试图在 if else 块中声明一个变量 如下所示 int main int argc char argv if argv 3 string simple Player player get Simple else if argv 3 s
  • 如何使用 Google Sheets (v4) API 修改依赖于特定单元格的特定数据行?

    我想找到一种使用 Google API 根据我提供的条件修改特定行数据的方法 类似于 SQL 的东西 UPDATE Customers SET ContactName Alfred Schmidt City Frankfurt WHERE

随机推荐

  • 脚本输出中日期更改的奇怪问题

    我的一位同事编写了一个 Google Apps 脚本来自动化工作流程 批准酒店的客房补偿请求 总的来说 该脚本似乎按预期运行 脚本中有一个按自动计划运行的函数 基于时间 而不是事件驱动 曾有过几次因入住日期晚了一位而导致预订错误的情况 不幸
  • 使用 Xceed PropertyGrid

    我是 C WPF 的初学者 正在尝试使用 Xceed PropertyGrid 他们在他们的网站上展示了一个示例
  • 删除 Woocommerce 中特定产品类别的添加购物车按钮

    我遇到如何从类别产品中删除购物车的问题 如果我将它应用于特定的 ID 或一般情况下的所有 ID 它就可以正常工作 但我无法对类别执行此操作 下面是我对此所做的代码 另外 我正在努力将相同的模式应用到相关文章部分 因此任何帮助将不胜感激 谢谢
  • 如何使用 opencv 和 Python 找到 ROI 内的轮廓?

    我试图找到图像特定区域的轮廓 是否可以只显示 ROI 内的轮廓 而不显示图像其余部分的轮廓 我在另一篇类似的文章中读到我应该使用面具 但我认为我使用得不正确 我对 openCV 和 Python 很陌生 所以非常感谢任何帮助 import
  • 检测网络下拉菜单是否将显示在屏幕外

    我有一个基于 CSS 的简单多级下拉菜单 第二或第三级可能会超出可见窗口 具有某些分辨率和窗口大小的组合 如果某些预构建的菜单控件检测到这种情况 它们只会向左而不是向右打开下拉菜单 我如何测试 使用 JS jQuery 这种情况 您可以使用
  • Playbook 位于子目录中,而不是紧邻 group_vars

    有谁知道如何将剧本放入文件夹中 但共享相同的角色 group vars 以及通常位于根目录的其他内容 这就是我想要的 root dir group vars roles inventory playbooks my playbook yml
  • 如何强制 Jackson 将字段值反序列化为小写

    我有一个公开 REST 端点的 spring 应用程序 让我们将其命名为 doAction 作为请求 它消耗对象 class Person private String name private String email 一些客户端可以通过
  • matplotlib 获取轴相对刻度位置

    我知道我可以通过以下方式获得 y 刻度的位置ax get yticks 顺便说一句 这是获得它们的最佳 正确方法吗 但我需要相对于轴限制的刻度位置 即在 0 和 1 之间 获得这个的最好方法是什么 我试过ax get yticks tran
  • 通过引用传递 int 与通过值传递 int 的好处?

    通过引用而不是值传递整数是否有性能优势 我这样说是因为如果您通过引用传递 您将创建一个 4 字节指针 但如果您通过值传递 您无论如何都会创建该值的 4 字节副本 那么它们都多占用了 4 个字节 对吗 是否可以使用强制转换通过引用传递 int
  • AttributeRouting - 从 RouteData 获取操作名称的正确方法

    我最近开始为我的操作方法使用属性路由 并且正在努力从 RouteData 获取操作名称 和 或 id 下面是我如何使用属性的示例 Route Edit id int public ActionResult Edit int id 之前我使用
  • ReSharper PdbNavigator 在符号服务器上找不到调试信息

    我们设置了 TeamCity 来为内部组件创建 NuGet 包和符号源包 符号源包正确包含 dll pdb 和源代码 一旦 TeamCity 创建了包 它们就会发布到我们的 NuGet SymbolSource 服务器 在 ReSharpe
  • 如何使用 POI SS 打开 .xlsx 文件?

    我正在尝试使用 POI SS 使用此代码打开 xlsx 文件 取自http poi apache org spreadsheet quick guide html ReadWriteWorkbook http poi apache org
  • 如何在Java中从sql模式生成orm映射类

    我有一个现有的 db sql 模式文件 是否可以在需要时生成并重新生成 DAO 实体以及访问它所需的所有其他帮助程序 客户端类 我不介意它会是什么 hibernate 其他 jpa 或其他东西 假设您 其他人仍在寻找解决方案 我刚刚遇到了同
  • 模块函数、静态方法、类方法、无装饰器:哪个习惯用法更Pythonic?

    我是一名 Java 开发人员 时常使用 Python 我最近偶然发现本文 http dirtsimple org 2004 12 python is not java html其中提到了 Java 程序员在学习 Python 时常犯的错误
  • 玩具操作系统文件系统[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经在 assembly c 中开发了一个运行基本终端的基本内核 我已将其设置为使用 grub 运行 iso 我想继续使用这个操作系
  • 了解 Spring MVC 中 @ModelAttribute 和 @RequestAttribute 注解的使用

    我对 Spring MVC 还很陌生 目前我正在学习Spring MVC 展示 https github com spring projects spring mvc showcase 演示了 Spring MVC Web 框架的功能 我无
  • 如何以编程方式停止水平滚动?

    我在cocos2d的CCLayer中有一个UITextView textView 文本在水平和垂直方向上滚动 但是 我需要它仅垂直滚动和弹跳 如何以编程方式停止水平滚动 UITextView textView UITextView allo
  • 如何将图像放入颤振图像中

    https i stack imgur com w5mLQ png https i stack imgur com w5mLQ png 就像我们在大图片中看到的一个小圆形图像一样 以及如何如图所示排列文字 https i stack img
  • ZoneInfoNotFoundError:“未找到带有 utc 密钥的时区”

    当尝试在浏览器上加载我的网页时 我收到了消息 服务器发生错误 请联系管理员 当我回去检查我的终端时 我看到了这条消息 zoneinfo common ZoneInfoNotFoundError 未找到具有关键 UTC 的时区 我检查过但不知
  • 如何使用变量来避免为工作表中的所有列创建一组变量?

    当单元格更改时 我试图让我的工作表在两个方向上自动重新计算计划内的一组日期 该代码工作正常 但我需要添加更多列 而且我真的不想多次复制 粘贴 查找 替换负载 我相当确定我可以使用变量来做到这一点 只需查找列标识符并以某种方式将其输入代码中