通过使用 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 刷新数据。
我想,如果从现有位置获取范围,移动到另一个位置,然后(这里是它失败的地方)移回 - 它必须有效。它会在移动一次时更新。
我找到了脚本,它在一侧完美运行。但是我没能坚持到最后。
我尝试过的:
- 使两个函数以相反的范围一个接一个地工作;
- 使用相同的逻辑将sourceRange、targetRange和source2Range、target2Range分开。
- 制作类似的,但它们之间有齐平;
- 制作一个函数来完成所有的动作;
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);
}
参考文献:
我想制作一个投资组合跟踪器,它从网络上获取信息并每分钟更新一次(时间触发器)加上 - 通过一个按钮(我想这部分不是很相关)。
这是带有一些示例数据的示例 Sheet: https://docs.google.com/spreadsheets/d/1Ikqv-XtHkEl6VOdPKG9QotnG31o09sZMPdAozzAM4Qs/edit?usp=sharing
我试过脚本一次复制进出同一个单元格,但它不会触发 Sheets 刷新数据。
我想,如果从现有位置获取范围,移动到另一个位置,然后(这里是它失败的地方)移回 - 它必须有效。它会在移动一次时更新。
我找到了脚本,它在一侧完美运行。但是我没能坚持到最后。
我尝试过的:
- 使两个函数以相反的范围一个接一个地工作;
- 使用相同的逻辑将sourceRange、targetRange和source2Range、target2Range分开。
- 制作类似的,但它们之间有齐平;
- 制作一个函数来完成所有的动作;
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); }