javascript - 尝试从公式 Google App 脚本中粘贴值
问题描述
这只是我在 Google App Script 中的代码片段,它遍历第 1、2、3 列中的每一行。如果在第 3 列中进行了编辑,则会生成一个增量 ID,并将同一行和不同列连接起来也将生成 - 在本例中为 D、E 和 F 列。我正在努力寻找一种将公式更改为值的方法。我在这里想念什么?
// Location format = [sheet, ID Column, ID Column Row Start, Edit Column]
var locations = [
["Consolidated Media Plan",1,9,3]
];
function onEdit(e){
// Set a comment on the edited cell to indicate when it was changed.
//Entry data
var range = e.range;
var col = range.getColumn();
var row = range.getRow();
// Location Data
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
function getNewID(){
function IDrange(){
var dataRange = sheet.getDataRange();
var lastRow = dataRange.getLastRow();
return sheet.getRange(IDrowStart,IDcol,lastRow-IDrowStart).getValues();
};
//Get largest Value in range
function getLastID(range){
var sorted = range.sort();
var lastIDval = sorted[sorted.length-1][0];
return lastIDval;
};
//Stores leading letters and zeroes and trailing letters
function getLettersNzeroes(id){
//Get any letters or zeroes.
var re = new RegExp("^([a-zA-Z0])$");
var letterZero = [];
for(char = 0; char < id.length; char++){
if(re.test(id[char])){
letterZero.push([char,id[char]]);// [[position, letter or zero]]
};
};
// Categorize letters and zeroes into start and end blocks
var startLetterZero = "",
endLetter = "",
len = letterZero.length - 1;
for(j = 0; j < letterZero.length; j++){
if(letterZero[j][0] === j){
startLetterZero += letterZero[j][1];
}else if(letterZero[j][1] !== "0" && letterZero[len][0] - (len - j) == letterZero[j][0]){
endLetter += letterZero[j][1];
};
};
var startNend = {"start":startLetterZero,"end":endLetter};
return startNend;
};
//Gets last id number. Adds 1 an checks to set if its new length is greater than the lastNumber.
function getNewNumber(id){
var removeZero = false;
var lastNum = parseInt(id.replace(/\D/g,''),10);//Remove letters
var newNum = (lastNum+1).toString();
if(lastNum.toString().length !== newNum.length){
var removeZero = true;
};
var newNumSet = {"num":newNum, "removeZero": removeZero};
return newNumSet
};
var lastID = getLastID(IDrange());
var lettersNzeroes = getLettersNzeroes(lastID);
var newNumber = getNewNumber(lastID);
//If the number is 9,99,999,9999 etc we need to remove a zero if it exists.
if(newNumber.removeZero === true && lettersNzeroes.start.indexOf("0") !== -1.0){
lettersNzeroes.start = lettersNzeroes.start.slice(0,-1);
};
//Rejoin everything together
var newID = lettersNzeroes.start +
newNumber.num +
lettersNzeroes.end;
return newID;
};
for(i = 0; i < locations.length; i++){
var sheetID = locations[i][0],
IDcol = locations[i][1],
IDrowStart = locations[i][2],
EditCol = locations[i][3];
var offset = IDcol - EditCol;
var cell = sheet.getActiveCell();
if(sheetID === sheet.getName()){
if(EditCol === col){
//ID Already Exists the editing cell isn't blank.
if(cell.offset(0,offset).isBlank() && cell.isBlank() === false){
var newID = getNewID();
cell.offset(0,offset).setValue(newID);
cell.offset(0,-1).setFormulaR1C1('=concatenate(R[0]C[-1],"_",INDEX(Glossary!K:K,MATCH(R[0]C[2],Glossary!J:J,0)))');
};
};
};
};
};
编辑: 这是我的完整代码,我试图仅检索同一公式中的值没有成功(即,如果 C9 被编辑,则应填充具有特定于第 9 行的值的公式)
此外,我尝试在代码底部的连接公式中添加索引/匹配公式 - 它在谷歌表格上按预期工作,但是当我使用脚本运行它时,它会粘贴正确的公式,但它返回一个#姓名?错误信息。但是,当我在单元格中复制并粘贴完全相同的公式时,它工作得很好,知道是什么导致了这个错误吗?
解决方案
这对我有用。我知道这不完全一样,但我无权访问 getNewId()
function onEdit(e) {
var sh=e.range.getSheet();
if(sh.getName()!='Sheet1')return;
//e.source.toast('flag1');
if(e.range.columnStart==3 && e.range.offset(0,1).isBlank() && e.value) {
//e.source.toast('flag2');
e.range.offset(0,1).setValue(e.value);
e.range.offset(0,2).setFormulaR1C1('=concatenate(R[0]C[-1],"_",R[0]C[-2],"_",R[0]C[-3],"_",R[0]C[-4])');
}
}
推荐阅读
- linux - 公开 linux 内核的 BootClock -> SystemTime 偏移量?
- r - 在 geom_line 图中显示多个分组 geom_hline 的图例
- maven - 使用 maven 添加运行时依赖 jar
- elasticsearch - 在 ec2 免费层上安装弹性搜索的问题
- r - R在更新后显示ggplot时崩溃(进程内存读取超出范围)
- reactjs - 如何在UseEffect中拥有多个不会出错的axios?
- xml - Oracle 12c XML 从响应中获取值
- javascript - 如何在reactjs中显示已检查的项目
- javascript - 在 React js 中重定向时将参数传递给新页面
- javascript - 创建的分页抓取不正确的索引一旦您转到下一页