如果单元格不为空,则将公式值转换为静态值

时间:2019-06-19 22:42:24

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

我正在使用一个脚本来计算位置之间的里程。例如,在圣地亚哥的A列,加利福尼亚的B列,加利福尼亚的C列,列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列中!==“”的单元格转换为静态值,从而将公式全部删除。预先感谢!

1 个答案:

答案 0 :(得分:2)

  • 作为测试用例,您将一个自定义公式放在{C {1}}列上,例如=DrivingMiles(A1,B1)
  • 当“ C”列的值不为空时,您希望将公式转换为静态值。
  • 您想使用Google Apps脚本实现这一目标。

从您的回复评论中,我可以像上面那样理解。如果我的理解是正确的,那么这个答案呢?我认为您的情况有几个答案。因此,请仅考虑其中之一。

模式1:

在这种模式下,当放置自定义公式=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);
}
  • 这可用于活动工作表。

参考文献: