我正在嘗試使用 appscript 開發道路建設的進度條形圖。我有一個用于輸入表單資料的選項卡。

在這個檔案中有多個道路名稱的更多選項卡。

就像這樣

這就是我想要做的。在資料輸入表單中輸入資料后,在相關條形圖中對指定位置的單元格范圍進行著色。這是我第一次嘗試找出從哪里開始著色的地方。以下代碼用于此。但在“if 陳述句”中運行“for 回圈”。但這并沒有成功。
var ss = SpreadsheetApp;
var sheet=ss.getActiveSpreadsheet().getSheetByName("AddData");
var actTabName = sheet.getRange("E1").getValue();
var catName = sheet.getRange("B4").getValue();
var start =sheet.getRange("B1").getValue();
var end = sheet.getRange("B2").getValue();
var side = sheet.getRange("B3").getValue();
function setBarChart() {
var markTab = ss.getActiveSpreadsheet().getSheetByName(actTabName);
var lstRw = markTab.getLastRow();
var lstCl = markTab.getLastColumn();
Logger.log(lstRw);
Logger.log(lstCl);
var catList = markTab.getRange(1,3,lstRw-2,1).getValues();
Logger.log(catList)
for(var i=0; i<catList.length; i ){
if(catList[i] == "Chainage"){
var chRNo = i 1;
var chList = markTab.getRange(chRNo,4,1,lstCl-3).getValues();
}
}
Logger.log("chRNo " chRNo);
if(side == "LHS"){
for(var j=0; j<8; j ){
if(catList[i] == catName){
var catLhRNo = j 1;
Logger.log("catLhRNo = " catLhRNo);
}
else{
Logger.log("test1");
}
}
}
if(side == "RHS"){
for (var k=8; k<11; k ){
if(catList[0][k] == catName){
var catRhRno = k 1;
Logger.log("catRhRno = " catRhRno);
}else{
Logger.log("test2");
Logger.log(catList[7]);
}
}
}
}
uj5u.com熱心網友回復:
我建議將復雜的操作分解為小的簡單函式:
function main() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('AddData');
// get the data from the sheet 'AddData'
var [start, end, side, item] = sheet.getRange('b1:b4').getValues().flat();
var tab = ss.getSheetByName(sheet.getRange('e1').getValue());
// get the row index from given sheet (tab), side and item
var row = get_row(tab, side, item);
// colorize the row on given sheet
colorize_row(tab, row, start, end);
}
// get the row index
function get_row(tab, side, item) {
var items = tab.getRange('b1:b11').getValues().flat();
if (side == 'LHS') return items.indexOf(item) 1;
if (side == 'RHS') return items.lastIndexOf(item) 1;
}
// colorize cells on the given tab and row
function colorize_row(tab, row, start, end) {
var chainage = tab.getRange(6, 2, 1, tab.getLastColumn()).getValues().flat();
var start_index = chainage.indexOf(start) 2;
var end_index = chainage.indexOf(end) - start_index 3;
var color = tab.getRange('b' row).getBackground(); // upd
tab.getRange(row, start_index, 1, end_index).setBackground(color); // upd
}
更新
如果要從 B 列動態獲取“Chainage”的行索引,可以colorize_row()這樣更改函式:
function colorize_row(tab, row, start, end) {
var chainage_row = tab.getRange('b:b').getValues().flat().indexOf('Chainage') 1;
var chainage = tab.getRange(chainage_row, 2, 1, tab.getLastColumn()).getValues().flat();
var start_index = chainage.indexOf(start) 2;
var end_index = chainage.indexOf(end) - start_index 3;
var color = tab.getRange('b' row).getBackground();
tab.getRange(row, start_index, 1, end_index).setBackground(color).mergeAcross();
}
uj5u.com熱心網友回復:
嘗試這樣的事情:
function totalfunk() {
var ss = SpreadsheetApp.getActive();
var sh = ss.getSheetByName("AddData");
var catName = sh.getRange("B4").getValue();
var side = sh.getRange("B3").getValue();
var msh = ss.getSheetByName(sh.getRange("E1").getValue());
var catList = msh.getRange(1, 3, msh.getLastRow() - 2, 1).getValues();
const catList1 = catList.slice(0, 8);
let i = catList.indexOf("Chainage")
if (~i) {//much quicker than using loop
var chRNo = i 1;
var chList = msh.getRange(chRNo, 4, 1, msh.getLastColumn() - 3).getValues();
}
let j = catList.indexOf(catName)''
if (~j && side == LHS) {
var catLhRNo = j 1;
}
if (~j && side == RHS) {
var catRhRno = j 1;
}
}
如果您不進行一些調整,我不希望這對您有用
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/438803.html
上一篇:如果有變化,比較2列并設定值
