在 R1C1 公式中使用列标题变量

2023-12-02

我正在尝试:

  1. 让谷歌脚本执行一个函数,在本示例中基于 F 列将公式(我认为使用 R1C1)插入到 G 列中,并在公式中使用变量作为列引用。公式为=NETWORKDAYS。我想确保我的函数搜索列标题名称而不是数字,以防列被移动。

  2. 插入 G 列的公式将更改其从哪一列中提取,具体取决于 F 列

  3. 对于我们这里的示例,如果 F 列中为“是”,G 列将具有公式 =NETWORKDAYS(A2,D2),并将其分别输入到 G 列中的每个单元格。

如果否,公式将为 =NETWORKDAYS(A2,B2),并将公式分别插入到 G 列的每个单元格中。

当前的问题:

  1. 我不确定如何对此进行编码,以便公式使用列标题名称,而不是像在 R1C1 表示法中那样使用硬编码的列号引用
  2. 我不太擅长 IF 语句,以及“传递”范围内的项目(即使函数在范围内移动),这对我来说仍然是一个灰色区域

Current Sheet: 1

What I would like to have happen/End Result of script: 2

Yes Formula Example 3

No Formula Example 4

当前代码:

function trainingDays(){

  //const/variables to find Training Days column
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
  const tf = ws.createTextFinder('Training Days');
  tf.matchEntireCell(true).matchCase(false);//finds text "Training Days" exactly
  const regionCellCol = tf.findNext().getColumn()//finds first instance of training days
  const regionCellRow = tf.findNext().getRow()

  //const/variables to find Race Date Announced
  const tfRaceDateAnnounced = ws.createTextFinder('Race Date Announced');
  tfRaceDateAnnounced.matchEntireCell(true).matchCase(false);//finds text "Race Date Announced" exactly
  const rdaCellCol = tfRaceDateAnnounced.findNext().getColumn()//finds first instance of race date announced
  const rdaCellRow = tfRaceDateAnnounced.findNext().getRow()

  //const/variables to find Training Date Ended
  const tfTrainingDateEnded = ws.createTextFinder('Training Date Ended');
  tfTrainingDateEnded.matchEntireCell(true).matchCase(false);//finds text Training Date Ended
  const tdeCellCol = tfTrainingDateEnded.findNext().getColumn()//finds first instance of training date ended 
  const tdeCellRow = tfTrainingDateEnded.findNext().getRow()

  //const/variables to find Training: Yes or No
  const tfTrain = ws.createTextFinder('Training: Yes or No');
  tfTrain.matchEntireCell(true).matchCase(false);//finds text Training: Yes or No
  const trainCellCol = tfTrain.findNext().getColumn()//finds first instance of Training: Yes or No
  const trainCellRow = tfTrain.findNext().getRow()
  
    //const/variables to find Race Date Commenced 
  const tfRDC = ws.createTextFinder('Race Date Commenced');
  tfRDC.matchEntireCell(true).matchCase(false);//finds text Race Date Commenced
  const rdcCellCol = tfRDC.findNext().getColumn()//finds first instance of race date commenced
  const rdcCellRow = tfRDC.findNext().getRow()



  //variable formulas

  var trainingDaysFormulaNo = [] //is =NETWORKDAYS(Race Date announced, race date commenced) ONLY IF Training is No
  var trainingDaysFormulaYes = [] //is =NETWORKDAYS(race date announced, training date ended) ONLY IF Training is Yes


ws.getRange(regionCellRow+1,regionCellCol,ws.getLastRow(),1).setFormulaR1C1()//not sure if this would work if I can figure out the formula to put in the .setFormulaR1C1 if I could pull the variable formulas and put into this, as an example .setFormulaR1C1(trainingDaysFormulaNo)

}//end of function trainingDays

我认为我的代码会做什么

我认为这段代码允许我将列名称范围插入到 R1C1 公式中,并在单元格范围中使用 setFormulaR1C1。另外我不确定要执行什么样的 IF 语句才能使该函数正常工作。

我尝试过的:

  1. 查看 stackoverflow 上的一些项目,但它似乎只与将 A1 表示法更改为 R1C1 相关,或者是 excel 特定的
  2. 我希望能够聪明/聪明地使用文本查找功能来调用列并以这种方式获取范围

参考:

在列中使用变量


由于您正在制定一个假设列标题可以位于不同位置的脚本,因此我建议使用setFormulas而不是 R1C1 版本,因为它必须使用相对于标头位置的偏移量。

请参阅下面的大修脚本:

function trainingDays(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName('sheet1');

  // search headers (converted to separate function to return row and column)
  const [tfRow, tfCol] = getLocationOfText(ws, 'Training Days');
  const [tfTYNRow, tfTYNCol] = getLocationOfText(ws, 'Training: Yes or No');
  // get columns only for other headers
  const [, tfRDACol] = getLocationOfText(ws, 'Race Date Announced');
  const [, tfRDCCol] = getLocationOfText(ws, 'Race Date Commenced');
  const [, tfTDECol] = getLocationOfText(ws, 'Training Date Ended');
  // convert number to letter for formula substition later 
  const tfRDA = String.fromCharCode(96 + tfRDACol).toUpperCase();
  const tfRDC = String.fromCharCode(96 + tfRDCCol).toUpperCase();
  const tfTDE = String.fromCharCode(96 + tfTDECol).toUpperCase();

  // offset lastRow with row index since data is not starting at 1
  const lastRow = ws.getLastRow();
  const tfTYNVal = ws.getRange(tfTYNRow + 1, tfTYNCol, lastRow - tfTYNRow, 1)
                     .getValues();

  // placeholder for output
  var output = [];

  // generate an array with the formula with each value in Yes/No column
  tfTYNVal.forEach((cell, index) => {
    // get row by offsetting index with row of header (+1 due to 0-indexing)
    var row = (tfTYNRow + index + 1);
    if(cell == 'Yes')
      output.push([`=NETWORKDAYS(${tfRDA}${row}, ${tfTDE}${row},)`]);
    else if(cell == 'No')
      output.push([`=NETWORKDAYS(${tfRDA}${row}, ${tfRDC}${row},)`]);
    // write blank if not yes or no (to avoid setFormulas from breaking)
    else
      output.push(['']);
  });

  // I personally avoided using R1C1 version since that uses offsets on range
  // It will be an issue when header location is changed since it will conform 
  // to the offset given based on your original header location
  ws.getRange(tfRow + 1, tfCol, lastRow - tfRow, 1).setFormulas(output);
}

function getLocationOfText(sheet, text) {
  const tf = sheet.createTextFinder(text);
  tf.matchEntireCell(true).matchCase(false);
  const tfNext = tf.findNext();

  return [tfNext.getRow(), tfNext.getColumn()]
}

输出1:

output1

输出 2(不同的列位置):

output2

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

在 R1C1 公式中使用列标题变量 的相关文章

  • 如何使用基于时间的触发器每小时运行一个脚本,仅在工作日的整点运行?

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

    Google Apps 脚本允许由各种事件触发脚本 看here https developers google com apps script guides triggers 当用户将任务标记为已完成 在 Google 任务中 时 我想更新
  • 尝试获取 Google accessToken

    看起来 无论我做什么 谷歌都在竭尽全力阻止我完成这个研究项目 我的项目让我使用 Google 电子表格作为数据库 并使用所述电子表格中的数据执行程序化的 Google 图片搜索 并向最终用户显示一些结果 设置说明 我开始按照此处的说明进行操
  • 如何在 Google 文档之间复制内容和格式?

    我需要复制 Google 文档的内容 并将其附加到另一个文档 如果我使用这样的东西 newDoc getBody appendParagraph template getText 我得到了文本 但丢失了原始文件中的格式 Bold Itali
  • 如何在多个文档中使用 Google Apps 脚本

    我有一个谷歌应用程序脚本 我想在多个文档中使用它 我也可能想稍后在这些文档中更改它 因此我必须使用same所有这些文档中的脚本 而不是该脚本的副本 我知道以下问题可能属于重复问题 但我不愿意接受它的答案 Google Apps 脚本 如何在
  • 如何在运行脚本之前提交活动单元格中所做的更改? (Google 表格/Google Apps 脚本)

    我正在使用 Google Apps 脚本在 Google 表格中创建提交表单 该表单位于一页上 提交内容被移至第二个隐藏页面 当用户填写表单后 他们按下提交页面上的按钮以激活脚本 我遇到的问题是 当用户填写最后一个单元格然后单击按钮时 输入
  • 从 Google Apps 脚本运行保存的 bigquery 查询?

    我们经常使用 Google Apps 脚本来运行 BigQuery 查询并将其放入 Google Sheet 中 然而 工作流程很烦人 在 BigQuery 中运行查询 直到正确为止 复制 粘贴到文本编辑器以放入换行斜杠 在应用程序脚本中运
  • ArrayFormula 破坏了 getLastRow() 函数。可能的解决方法?

    在我的电子表格中 我有一个正在运行的脚本 它使用getLastRow 功能是其逻辑的重要组成部分 自从我在其中一列中应用数组公式以来 getLastRow 功能无法正常工作 即使其他列中没有其他值 数组公式似乎也一直 应用 到工作表的底部
  • 使用 google apps 脚本添加大量响应

    我想制作一个脚本 添加大量 大约 1500 简历和候选人信息作为对表单的回复 我有谷歌电子表格的信息 我将其链接到表单 但我只能管理回复 即使我更改电子表格 或添加 表单中也不会发生更新 我正在添加行 但没有添加响应 那可能吗 我看到了 2
  • 如何使用 Google Apps 脚本将文件夹从我的云端硬盘复制到团队云端硬盘?

    我发现以下 Google Apps 脚本允许我将文件夹从 MyDrive 复制到 MyDrive 以及将 SharedFolders 复制到 MyDrive function start var sourceFolder source va
  • 重命名带有“完整工作表”图表的工作表会导致电子表格重新加载

    Google 表格允许将图表移动到自己的表格中 不过 谷歌脚本似乎无法重命名这些工作表 而不会使电子表格崩溃并强制其重新加载 要明白我的意思 请尝试以下操作 1 创建新的电子表格并在其中放入一些数据 2 使用数据创建任何类型的图表 3 编辑
  • 从 Google 电子表格中的列填充 HTML 下拉菜单

    我是 gs 的新手 所以这应该不难 我有一个 Google 电子表格 其中一列中有值 假设 A 列 我使用 gs 创建了一个自定义菜单 用户将在其中选择一个选项 单击其中一个选项 新组件 将出现一个弹出窗口 其中包含一个下拉菜单 用户应从其
  • 向文档添加动态页眉/页脚

    我想知道是否有一种方法可以向文档添加动态页眉或页脚 即在页脚中添加每个页面都不同的 页面标题 据我所知 编辑内置页眉或页脚将反映在每个页面上 我想知道是否有人想到了一种解决方法 通过访问页面上的第一行 最后一行并在那里插入文本来 强制 它
  • 如何将值传递到 HTML 模板侧边栏?

    我的任务是更换一些现有的 Access 数据库 我想知道你们是否可以帮助我 目前 我有一个谷歌表格 https docs google com spreadsheets d 1JS5Iwx60Zk7VL8lYz6Yj7ew4eYPhl2Nk
  • 联系人应用程序性能

    对谷歌脚本的 ContactsApp 进行一些测试并加载联系人 看起来运行 ContactsApp getContacts 加载所有联系人 所需的时间与运行 ContactsApp getContact email 特定联系人 所需的时间一
  • 如何通过 Apps Script & Drive SDK 创建新的脚本文件

    尝试通过在 Apps 脚本中调用 Drive SDK 来创建包含文件的新项目 下面的内容到底会放在哪里UrlFetchApp要求 files id 9basdfbd 749a 4as9b b9d1 d64basdf803 name Code
  • 在 Google 表格中批量查找并替换正则表达式

    是否有函数 脚本或插件可以将大量正则表达式替换应用于 Google 表格中的一系列数据 我有一张包含地址列表的工作表 另一张工作表在两列中包含几十对正则表达式 例如 St 和 Street 我想替换地址中第一列短语的所有实例列出另一个中相应
  • 移动设备:缺少操作

    我正在尝试执行该操作的 POST 但是 当我发出请求时 我收到代码 400 表示操作值丢失 my code function mobileAPIPOST var response UrlFetchApp fetch https www go
  • Google Add-on 在有限模式应用脚本中添加菜单项

    我们在新的谷歌应用程序脚本添加商店中发布了一个插件 但在除安装的初始电子表格之外的任何电子表格中使用该插件时 权限似乎无法正常工作 我遇到一个问题 当创建新电子表格并且用户从 管理加载项 菜单中选择 使用此加载项 时 我们的菜单项不会填充
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答

随机推荐

  • 最简单的 MySQL 到 MySQLi 过渡

    我目前正在使用我在课堂上教授的已贬值的MySQL 我发现这不是正确的方法 有两个更好的选择 MySQLi 和更好的 PDO 虽然我发现切换到 PDO 对我来说有点困难 因为我对 OOP 一无所知 但我认为至少切换到 MySQLi 是必须的
  • 修复“包含重复的‘编译’项目。” Visual Studio 中的错误

    这是一个非常烦人的 VS 错误 我使用的是 VS 2019 16 8 1 我花了很多时间来修复它 包含重复的 编译 项目 NET SDK 包括 默认情况下从项目目录 编译 项目 你可以 从项目文件中删除这些项目 或设置 如果需要 可将 En
  • MySQL变量存储数据库名称

    我有一个很长的脚本 需要在几个不同的数据库上运行 所有数据库都具有相同的表和字段名称 我想做的是这样的 1 SET TARGET DATABASE beta 2 SET SOURCE DATABASE sandbox 3 4 CREATE
  • 通过 Chrome 上的 KBX 扩展程序安装时 Kynetx 应用程序无法运行

    我的应用程序正在加载外部 javascript 文件jQuery getScript 当我使用书签或扩展程序启动应用程序时 一切正常 当应用程序通过 KBX 安装时 虽然在内部Chrome与KBX扩展javascript 文件中包含的函数无
  • 如何在asp.net中实现文件下载

    使用 asp net 2 0 从网页实现下载操作的最佳方法是什么 操作的日志文件在名为 Application Root Logs 的目录中创建 我有完整路径并想提供一个按钮 单击该按钮会将日志文件从 IIS 服务器下载到用户本地电脑 这有
  • 购物车表如何与另一个表关联?

    我有表 table name id cart token data created at Updated at 想要使用令牌列 table name cart token cart token 与商店购物车表关联 只要购物车表没有 Cart
  • mysql 自然排序

    我有像这样的桌子server id name ip 当我尝试按名称对结果进行排序时 我得到 srv1 srv10 srv11 srv2 srv6 但我需要像这样的结果srv1 srv2 srv6 srv10 srv11 我知道的一个想法是
  • ORA-01855: 上午/上午或下午/下午必需的

    我收到错误 ORA 01855 AM A M or PM P M required 当我尝试执行以下查询时 INSERT INTO TBL ID START DATE values 123 TO DATE 3 13 2012 9 22 00
  • 半径/最近结果 - Google 地图 API

    首先 我使用 Google Maps API v3 我有一张大地图 显示从数据库中提取的所有结果 现在我想实现一个功能 显示距当前位置 X 公里内最近结果的半径 由 HTML5 地理定位提供 由于地图包含所有结果 我希望能够添加X公里 然后
  • 在 linq 中使用 ANY 条件处理 WHERE 内的空值

    我的问题是 db 对象可以有空描述 ofc linq 将抛出空异常 我用它来搜索描述和标题 这是代码 string searchQry searchString Split searchQry searchQry Select sq gt
  • 相机拍摄的照片上传异常(Firebase 存储)

    我正在尝试将 Android 应用程序中相机拍摄的图像上传到 Firebase 存储 问题是我拍照后在确认activity 我按下确认按钮 它显示 不幸的是 应用程序已停止 这是当我按下检查按钮时的图像 应用程序崩溃了 这是我的代码 应用程
  • 使用 jQuery 选择一个选项?

  • 将 ViewData\ModelState 导出到子操作

    正如题主所说 这是一个坏主意吗 如果是这样 为什么 目前 如果您从 Html Acion 内部渲染某些输入字段 则不会向用户显示验证错误 因为当涉及 Html Action 时 在其上下文中 ModelState 会被清除 那么最好的模式是
  • 将值和标签设置为 JComboBox

    我有一个 JComboBox 其中的项目是查询的结果 该组合显示了从查询中获取的所有类别名称 对吧 好的 它有效 现在我需要给每个项目一个值 这将是产品的 ID 这是我到目前为止所得到的 final JComboBox proveedorC
  • asp.net特殊标签之间的区别

    我现在正在开发应用程序的前端部分 我想到了一个问题 asp net特殊标签有什么区别 如果存在其他特殊标签 请描述其功能
  • Inno Setup Exec 不等待 InstallShield 卸载完成

    尝试使用卸载字符串卸载软件 并使用Exec in InitializeSetup 在安装之前 它不会等待卸载完成 而是继续在 Inno Setup 中进行下一步安装 我正在使用以下代码和我尝试在 Installshield 产品中卸载的软件
  • 如何以编程方式使用图像添加栏按钮

    我正在以编程方式创建一个栏按钮 但它无法固定到屏幕上 帮助我解决这个问题 截屏 UIImage image UIImage imageNamed request png UIBarButtonItem button2 button2 set
  • DateTime.Now.Ticks 在循环内重复

    我正在尝试为表的主键生成唯一 ID 并且我正在使用DateTime Now Ticks为了它 这是目前我们无法使用的要求Identity 但有时 在循环内 它会在连续迭代中生成相同的 ID 我的简化代码如下所示 While Incoming
  • 在自定义元素的 :host 声明中使用 CSS 计数器重置

    运行代码片段 我希望我的 DIV 编号显示从0 所以我想使用以下命令从 1 开始计数器 counter reset square 1 然而 在使用时此设置将被忽略 host counter reset当所有 DIV 都包含在额外的父 DIV
  • 在 R1C1 公式中使用列标题变量

    我正在尝试 让谷歌脚本执行一个函数 在本示例中基于 F 列将公式 我认为使用 R1C1 插入到 G 列中 并在公式中使用变量作为列引用 公式为 NETWORKDAYS 我想确保我的函数搜索列标题名称而不是数字 以防列被移动 插入 G 列的公