【问题标题】:Convert Formula Value to Static Value if Cell is not blank如果单元格不为空,则将公式值转换为静态值
【发布时间】:2019-06-19 22:42:24
【问题描述】:

我正在使用一个脚本来计算位置之间的英里数。例如,A 列 San Diego, CA 列 B 列 San Francisco 列 C 508.3。如果 A 列或 B 列是 === "",则它将列设置为 ""。

// Note: This is not my code. 

function DrivingMeters(origin, destination) {
    var directions = Maps.newDirectionFinder()
    .setOrigin(origin)
    .setDestination(destination)
    .getDirections();
    return directions.routes[0].legs[0].distance.value;
}

function DrivingMiles(origin, destination) {
  if (origin === "" || destination === "") {
    return "";
  } else {
  return DrivingMeters(origin, destination)/1609.34;
  }
}

我正在尝试限制我进行 API 调用的次数,因为我有很多定期添加的信息。如果任一列为空白,我采取的第一步是在 API 调用之前返回“”。我还想做的是将C列中的单元格转换为 !== "" 为静态值,将公式全部删除。提前致谢!

【问题讨论】:

  • 关于What I would also like to do is convert cells in Column C that are !== "" to a static value removing the formula all together.,你想什么时候做这个?例如,在使用 OnEdit 事件触发器时,当自定义函数放在“C”列的单元格中并且“C”列为空时?或者在不使用触发器的情况下,您是否想通过手动运行脚本将“C”列(结果为空)的所有公式转换为电子表格中的静态值?
  • @Tanaike 我认为如果这可以在函数运行时完成会很好,所以在函数本身中。也许它可以返回一个静态值。编辑时也会很棒。如果我不得不偶尔手动运行它,我什至可以。
  • 感谢您的回复。我提出了 2 个示例脚本来实现您的目标作为答案。你能确认一下吗?请选择其中之一。如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
  • 我只希望将已返回值的单元格转换为静态值,例如 C1 508.3 mi。未返回值的单元格应保留公式。例如 A2 San Diego B2 "" C2 (有公式)。很抱歉,我可能解释得不好。
  • 感谢您的回复。请不要道歉。我的回答不适合您的情况的原因是由于我的英语水平不佳。所以我想确认正确理解你的目标。当“C”列具有值时,您希望将公式转换为“C”列的值。另一方面,当“C”列没有值时,您希望保留公式。我的理解正确吗?

标签: google-apps-script google-sheets google-sheets-api


【解决方案1】:
  • 作为测试用例,您将自定义公式放入“C1”列,如=DrivingMiles(A1,B1)。
  • 当“C”列的值不为空时,您希望将公式转换为静态值。
  • 您希望使用 Google Apps 脚本实现此目的。

从您的回复评论中,我可以理解如上。如果我的理解是正确的,这个答案怎么样?我认为您的情况有几个答案。所以请认为这只是其中之一。

模式一:

在这个模式中,当=DrivingMiles()的自定义公式被放入时,当返回值不为空时,公式转换为值。

针对这种情况,我使用了简单触发器的 OnEdit 事件触发器。当您使用此脚本时,请复制并粘贴以下脚本,并输入自定义公式,如=DrivingMiles(A1,B1)。当返回值不为空时,公式自动转换为静态值。

示例脚本:

function onEdit(e) {
  var value = e.range.getValue();
  if (e.range.getColumn() === 3 && ~e.range.getFormula().toUpperCase().indexOf("=DRIVINGMILES(") && value) {
    e.range.setValue(value);
  }
}
  • 如果要为特定工作表运行 OnEdit 事件触发器,请修改上述脚本。

模式2:

在此模式中,当运行以下脚本时,当单元格具有值和公式或只有值时,“C”列的单元格将从公式转换为值。

示例脚本:

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(1, 3, sheet.getLastRow(), 1); // Column "C"
  var values = range.getValues();
  var formulas = range.getFormulas();
  var convertedValues = values.map(function(e, i) {return e[0] && formulas[i][0] || e[0] ? [e[0]] : [formulas[i][0]]});
  range.setValues(convertedValues);
}
  • 这可用于活动工作表。

参考资料:

【讨论】:

  • Tanaike - 这些都是艺术品,一如既往。为了我们学习者的利益,请您解释一下Pattern1中if语句和Pattern2中最后两行代码的作用。
  • @Tedinoz 感谢您的评论。 1、关于the if statement in Pattern1,当编辑“C”列,put公式中包含=DRIVINGMILES(,值为""时,为真。 2.关于the last two lines of code in Pattern2,当值为"",放入公式的条件为真和假时,分别返回a1Notation和""。然后,清除 a1Notations 的范围。现在我更新了我的答案。所以当你查看原始脚本时,请查看the revision of my answer。
  • @Tedinoz 作为补充说明,~e.range.getFormula().toUpperCase().indexOf("=DRIVINGMILES(") 的~ 是位反转运算符。我用它来判断真假。例如,~"abc".indexOf("b") 和 ~"abc".indexOf("d") 分别是 -2 和 0。当这些用于 if 语句时,它们分别为 true 和 false。
  • @Tanaike 非常有效。谢谢!如果您有 PayPal,我很想请您喝杯咖啡。
  • @Brandon 感谢您的回复。我很高兴你的问题得到了解决。我可以从你的问题中学习。也谢谢你。
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多