我有一张Google Sheet,我想将其用作模板。用户提交表单,OnFormSubmit触发器生成模板的副本,并用答案替换某些文本。我想在几个应用程序中使用它,并且这些文本字段的位置可能会发生变化,因此我不想为每次替换指定特定范围或命名范围。
使用this question中的一些整洁代码,我可以完全按照自己的意愿行事。除此之外,使用此方法删除模板中的公式。换句话说,模板中的单元格具有=E10*F10
,但在替换后,该值为空或0。
是否可以在我拥有的代码中修复此问题?除了尝试不同的方法,我无法找到解决方案......
function replacetext(target,key,value){
var spread_sheet = SpreadsheetApp.open(target)
var sheet = spread_sheet.getSheetByName('Sewage Flows');
replaceInSheet(sheet,key,value);
}
function replaceInSheet(sheet, to_replace, replace_with) {
//get the current data range values as an array
var values = sheet.getDataRange().getValues();
Logger.log("values: " + values)
//loop over the rows in the array
for(var row in values){
//use Array.map to execute a replace call on each of the cells in the row.
var replaced_values = values[row].map(function(original_value){
return original_value.toString().replace(to_replace,replace_with);
});
//replace the original row values with the replaced values
values[row] = replaced_values;
}
//write the updated values to the sheet
sheet.getDataRange().setValues(values);
}
答案 0 :(得分:0)
这不是最好的解决方案,它看起来效率很低但是有效。我将方法从使用getValues()
抓取所有值改为getDataRange()
然后我只检查一个公式并跳过这些单元格。也许有更好的方法。
function replacetext(target,key,value){
var spread_sheet = SpreadsheetApp.open(target)
var sheet = spread_sheet.getSheetByName('Sewage Flows');
replaceInSheet(sheet,key,value);
}
function replaceInSheet(sheet, to_replace, replace_with) {
//get the current data range values as an array
var range = sheet.getDataRange();
var LastRow = range.getLastRow();
var LastCol = range.getLastColumn();
for(var i=0; i<= LastRow; i++){
for(var k=0; k<= LastCol; k++){
var formula = sheet.getRange(i+1,k+1).getFormula();
if(formula == ""){
var old_value = sheet.getRange(i+1,k+1).getValue().toString()
var new_value = old_value.replace(to_replace,replace_with);
Logger.log("old, new: " + old_value + ", " + new_value);
sheet.getRange(i+1,k+1).setValue(new_value);
}
}
}
}