通过使用 Google 脚本从单元格复制公式并返回来更新 IMPORTHTML 结果

Update IMPORTHTML result by copying formula from cell and back using GoogleScript

我想制作一个投资组合跟踪器,它从网络上获取信息并每分钟更新一次(时间触发器)加上 - 通过一个按钮(我想这部分不是很相关)。

这是带有一些示例数据的示例 Sheet: https://docs.google.com/spreadsheets/d/1Ikqv-XtHkEl6VOdPKG9QotnG31o09sZMPdAozzAM4Qs/edit?usp=sharing

我试过脚本一次复制进出同一个单元格,但它不会触发 Sheets 刷新数据。

我想,如果从现有位置获取范围,移动到另一个位置,然后(这里是它失败的地方)移回 - 它必须有效。它会在移动一次时更新。

我找到了脚本,它在一侧完美运行。但是我没能坚持到最后。

我尝试过的:

None 上面的工作通过了范围移动一次的点。 以下是使用的代码选项:

function refreshPortfolioData() {
  var activeSheet,numberOfSourceColumnsToGet,sourceColumnStart,sourceFormulas,sourceRange,
      sourceRowStart,targetColumn,targetRange,targetRowStart;

  //USER INPUT

  sourceRowStart = 6; //Row to start getting formulas from
  sourceColumnStart = 7; //Column to start getting formulas from
  numberOfSourceColumnsToGet = 1; //Number of columns to get formulas from

  targetRowStart = 6; //Row to start copying formulas to
  targetColumn = 21; //Column to start copying formulas to

  //END OF USER INPUT

  activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sources');
  sourceRange = activeSheet.getRange(sourceRowStart, sourceColumnStart, activeSheet.getLastRow(), numberOfSourceColumnsToGet);

  sourceFormulas = sourceRange.getFormulas();//Get only formulas from the source range

  targetRange = activeSheet.getRange(targetRowStart,targetColumn,sourceFormulas.length,sourceFormulas[0].length);

  targetRange.setFormulas(sourceFormulas);//Copy the formulas to the target range
  
  targetFormulas = targetRange.getFormulas();//Get only formulas from the source range
  
  //SpreadsheetApp.flush()

  sourceRange.setFormulas(targetFormulas);//Copy the formulas to the target range
  }

撤销更改的扩展示例:

  <...>
  SpreadsheetApp.flush()
  var activeSheet,numberOfSourceColumnsToGet,sourceColumnStart,sourceFormulas,sourceRange,
      sourceRowStart,targetColumn,targetRange,targetRowStart;

  //USER INPUT

  sourceRowStart = 6; //Row to start getting formulas from
  sourceColumnStart = 21; //Column to start getting formulas from
  numberOfSourceColumnsToGet = 1; //Number of columns to get formulas from

  targetRowStart = 6; //Row to start copying formulas to
  targetColumn = 7; //Column to start copying formulas to

  //END OF USER INPUT

  activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sources');
  sourceRange = activeSheet.getRange(sourceRowStart, sourceColumnStart, activeSheet.getLastRow(), numberOfSourceColumnsToGet);

  sourceFormulas = sourceRange.getFormulas();//Get only formulas from the source range

  targetRange = activeSheet.getRange(targetRowStart,targetColumn,sourceFormulas.length,sourceFormulas[0].length);

  targetRange.setFormulas(sourceFormulas);//Copy the formulas to the target range
  }

任何人都可以帮我解决这里的选项吗?

修改点:

  • 为了刷新Google Spreadsheet 上的公式,好像需要从当前的公式中替换一次其他的。在您的脚本中,相同的公式被覆盖。我认为这可能是您遇到问题的原因。
  • 在您的情况下,我认为可以使用 clearContent().
  • sourceFormulas 直接放入 sourceRange 而不是 targetRange

当以上几点反映到你的脚本中,就会变成下面这样。

修改后的脚本:

从:
sourceFormulas = sourceRange.getFormulas();//Get only formulas from the source range

targetRange = activeSheet.getRange(targetRowStart,targetColumn,sourceFormulas.length,sourceFormulas[0].length);

targetRange.setFormulas(sourceFormulas);//Copy the formulas to the target range

targetFormulas = targetRange.getFormulas();//Get only formulas from the source range

//SpreadsheetApp.flush()

sourceRange.setFormulas(targetFormulas);//Copy the formulas to the target range
到:
sourceFormulas = sourceRange.getFormulas();
sourceRange.clearContent();
SpreadsheetApp.flush(); // This might not be required to be used.
sourceRange.setFormulas(sourceFormulas);

注:

  • 作为其他方法,当您的情况使用TextFinder时,它变成如下。

      function sample() {
        var orgFormula = "=TRANSPOSE";
        var tempFormula = "=sample";
        const range = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sources').getRange("G6:G14");
        range.createTextFinder(orgFormula).matchFormulaText(true).replaceAllWith(tempFormula);
        range.createTextFinder(tempFormula).matchFormulaText(true).replaceAllWith(orgFormula);
      }
    

参考文献: