用脚本替换单元格的公式

时间:2012-11-15 21:53:31

标签: google-apps-script

我试图在电子表格的单元格D3中替换公式的某些部分,但我似乎无法做到。 D3中的公式很长,但我只需要替换searchtext变量并将其替换为replacetext变量。有任何想法吗?这是我的代码。

function dashboards(){ 

var ss1 = SpreadsheetApp.getActiveSpreadsheet();
var origSheet1 = ss1.getSheetByName('Daily');
var searchtext = Browser.inputBox("Enter search text");
var replacetext = Browser.inputBox("Enter replace text");
var form = origSheet1.getRange("D3").getFormulaR1C1();
form.indexof(searchtext);
var updated = form.replace(searchtext, replacetext);
form.setFormula(updated);}

2 个答案:

答案 0 :(得分:2)

你离我不远。问题是form,下面是一个String,而不是对Range的引用。

var form = origSheet1.getRange("D3").getFormulaR1C1();

您可以通过插入

来看到这一点
Logger.log(form + "; type: " + typeof form); //String

在该行之后并在脚本编辑器中检查日志。

您只需要更改

form.setFormula(updated);

origSheet1.getRange("D3").setFormulaR1C1(updated);

更新实际范围。

答案 1 :(得分:1)

复制下面的代码并通过脚本管理器或菜单项运行它。

它可以根据所选范围进行操作,无论是单个单元还是多个行和/或多个行。列。

它会弹出一个Toast消息,告诉您程序何时完成,但是如果您想要进行更多更换,它会打开UiInstance。

您可以将其保持打开状态,并在多个选项的公式中执行多次搜索/替换,或在不同的工作表上执行相同的搜索。

function handySRF() { // script composed by ailish@ahrosters.com
  var ss = SpreadsheetApp.getActive();
  var app = UiApp.createApplication().setHeight(200).setWidth(270).setTitle('Search and Replace In Formulas');

  var panel = app.createAbsolutePanel().setId('panel').setHeight(198).setWidth(268)
      .setStyleAttribute('background', 'lightCyan');

  var lblSearch = app.createLabel('Search for:').setId('lblSearch');
  var txtSearch = app.createTextBox().setId('txtSearch').setName('txtSearch');

  var lblReplace = app.createLabel('Replace with:').setId('lblReplace');
  var txtReplace = app.createTextBox().setId('txtReplace').setName('txtReplace');

  var handler = app.createServerHandler('btnStartSearch'); 
  var btnStartSearch = app.createButton('Start Search').addClickHandler(handler)
      .setStyleAttribute('background', 'lightGreen');
  handler.addCallbackElement(panel);

  var handler2 = app.createServerHandler('btnCloseWindow'); 
  var btnCloseWindow = app.createButton('Close Window').addClickHandler(handler2)
      .setStyleAttribute('background', 'lightYellow');
  handler2.addCallbackElement(panel);

  panel.add(lblSearch, 10, 6)
  panel.add(txtSearch, 10, 33)
  panel.add(lblReplace, 10, 75)
  panel.add(txtReplace, 10, 100)
  panel.add(btnStartSearch, 10, 151)
  panel.add(btnCloseWindow, 130, 151)
  app.add(panel);
  ss.show(app);
};

function btnStartSearch(e) {
  var ss = SpreadsheetApp.getActive();
  var app = UiApp.getActiveApplication();

  var search = e.parameter.txtSearch;
  var replace = e.parameter.txtReplace;

  var rows = ss.getActiveSelection();
  var numRows = rows.getNumRows();
  var formulas = rows.getFormulas();
  var newFormulas = [];

  for (var i = 0; i <= numRows - 1; i++) {
    var oldData = formulas[i];
    var newData = [];
    for (var j=0; j<oldData.length; ++j) {
        var item = oldData[j].replace(new RegExp(search, "g"), replace);
        newData.push(item);
    }
    newFormulas.push(newData);
  }
  rows.setFormulas(newFormulas);
  var str = 'Finished replacing ' + search + ' with ' + replace;
  ss.toast(str, '', 2);
};


function btnCloseWindow(e) {
  var ss = SpreadsheetApp.getActive();
  var app = UiApp.getActiveApplication();
  app.close();
  return app;
};