所以我有多個檔案,其中有一列我想在公式中更新。但是,可能有某個單元格中已經有一個值,但我不想用公式替換它(請參閱螢屏截圖以供參考)。

我在這里閱讀了一些參考資料,但還沒有找到像我這樣的類似案例。
這是我所做的嘗試,但它不起作用:
function updateWithFormula(){
/*** Input Data From Multiple Sources ****/
var sourceWorkbook = SpreadsheetApp.openById('')//id of the workbook
//Open tab 'Sheet1' and pull the data inside the script
var sourceSheet = sourceWorkbook.getSheetByName('Sheet1')
var source = sourceSheet.getDataRange().getDisplayValues()
for(row in source){
if (source[row][3]=="Update Value") {
//open files through link
var files = SpreadsheetApp.openByUrl(source[row][2]) //there's a link inside this column that linked to the file that I want to update
/*******insert formula *******/
//get range that want to be inserted by the formula, which is column S
//if the column S already have value in it, I don't want to do anything in it, however if it doesn't have value, I would like to put a formula
var result = files.getSheetByName('Sheet1').getRange("S2:S") //this is the column that I want to update
//set formula
for(r in result)
{
if(result[r] == "")
result[r].setFormula("=R" r 1)
}
}
}
}
你們知道為什么我的代碼不起作用嗎?對這種情況有什么建議嗎?
謝謝!
uj5u.com熱心網友回復:
客觀的
如果我理解正確,您的目標如下:
- 從包含要更新哪些電子表格的資訊的“主”電子表格中檢索資料。
- 遍歷所述資料并找到需要更新的電子表格(表示為行)。
- 單獨打開這些電子表格。
- 如果滿足特定條件(在這種情況下,單元格為空白),則使用作業表公式更新這些電子表格行。
問題
for(var a in b)javaScript 中的語法用于遍歷物件,而不是陣列。您應該將其更改為:
for (var i = 0; i<source.length; i ){
//YOUR CODE
}
where:source[i]讓您訪問該特定行。
- 當您嘗試獲取單個作業表的值時,您實際上只獲取了范圍,而不是值本身。你應該替換這個:
var result = files.getSheetByName('Sheet1').getRange("S2:S")
有了這個:
var sheet = files.getSheetByName('Sheet1');
var range = sheet.getRange("S2:S");
var values = range.getValues();
(您可以在此處閱讀有關范圍及其??作業原理的更多資訊)。
- 要將值輸入到電子表格中,您應該使用類中的
setValue()方法來完成range。再次,去這里了解更多資訊。所以,而不是:
result[r].setFormula("=R" r 1)
利用:
var rangeToModify = sheet.getRange(j, 19); //LETTER S IS THE 19TH
rangeToModify.setValue("=R" (j 1)); //SET THE FORMULA
最終代碼
function updateWithFormula(){
var sourceWorkbook = SpreadsheetApp.openById('')//id of the workbook
//Open tab 'Sheet1' and pull the data inside the script
var sourceSheet = sourceWorkbook.getSheetByName('Sheet1')
var source = sourceSheet.getDataRange().getDisplayValues()
for(var i = 0; i<source.length; i ){
if (source[i][3]=="Update Value"){
var files = SpreadsheetApp.openByUrl(source[row][2]);
var sheet = files.getSheetByName('Sheet1');
var range = sheet.getRange("S2:S");
var values = range.getValues();
//set formula
for(var j = 0; j<values.length; j ){
if (values[j] == ""){
//GET THE RANGE THAT YOU WANT TO MODIFY
var rangeToModify = sheet.getRange(j, 19); //LETTER S IS THE 19TH
rangeToModify.setValue("=R" (j 1)); //SET THE FORMULA
}
}
}
}
}
uj5u.com熱心網友回復:
我相信你現在的情況和你的目標如下。
- “Sheet1”的
sourceWorkbook“C”和“D”列分別具有電子表格 URL 和“更新值”的值。 - 您想從URL中檢索電子表格,并想在檢索到的電子表格中檢查“Sheet1”的“S2:S”列,并想將一個公式放在
"=R" r 1“S”列的非空單元格中.
在這種情況下,如何進行以下修改?
改裝要點:
var result = files.getSheetByName('Sheet1').getRange("S2:S")回傳類范圍物件。這不能與for(r in result). 這是 的原因but it's not working。Oriol Castander的回答已經提到了這一點。- 當
setFormula在一個回圈中被使用,該方法成本變高。
當這些點反映在你的腳本中時,它變成如下。
修改后的腳本:
function updateWithFormula() {
var sourceWorkbook = SpreadsheetApp.openById(''); // Please set your Spreadsheet ID.
var sourceSheet = sourceWorkbook.getSheetByName('Sheet1');
var source = sourceSheet.getDataRange().getDisplayValues();
source.forEach(r => {
if (r[3] == "Update Value") {
var sheet = SpreadsheetApp.openByUrl(r[2]).getSheetByName("Sheet1");
var rangeList = sheet.getRange("S2:S" sheet.getLastRow()).getDisplayValues().flatMap(([e], i) => e == "" ? [`S${i 2}`] : []);
if (rangeList.length > 0) {
sheet.getRangeList(rangeList).setFormulaR1C1("=R[0]C[-1]");
}
}
});
}
- 在此修改中,使用范圍串列將公式放置為 R1C1。這樣,我認為工藝成本將能夠降低一點。
參考:
- getRangeList(a1Notations)
- setFormulaR1C1(公式)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/402865.html
標籤:
