2012-11-15 48 views
0

我试图用电子表格的单元格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

你不远处。问题是,form,下面,是一个字符串,而不是你的范围的引用。

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

您可以通过该行后插入

Logger.log(form + "; type: " + typeof form); //String 

和检查日志中的脚本编辑器看到这一点。

你只需要改变

form.setFormula(updated); 

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

更新的实际范围。

+0

这听起来很合逻辑,但每当我运行脚本都不会替换文本。我会分享我的电子表格,以便您有一个想法。我想用S-Dec-2012取代S-Nov-2012。我做了你指定的更改,但仍然没有得到文本替换。这是电子表格。 https://docs.google.com/a/infolinksa.net/spreadsheet/ccc?key=0AgIoLd4RqjMXdE5ybDVkTTFmWHFCSllCeWd4Vm5VR1E#gid=0 –

+1

啊 - 用'indexof'删除行 - 目前没有添加任何内容,并且套管错误(应该是'indexOf')。由此引发的错误会阻止脚本的其余部分运行。 –

1

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

它可以在任何选定的范围内进行操作,无论是单个单元还是延伸到多行&列。

它会弹出一条吐司消息,告诉你何时该过程已经完成,但是如果你想进行更多的替换,它会使UiInstance处于打开状态。

您可以保持它打开并在多个选择的公式中执行多个搜索/替换或在不同的工作表上进行相同的搜索。

function handySRF() { // script composed by [email protected] 
    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; 
}; 
+0

谢谢你的回答,这是有帮助的,但不是我所期待的。 –

相关问题