簡體   English   中英

表格的Google Apps腳本自定義功能-找不到范圍

[英]Google Apps Script custom function for sheets - range not found

我有一個問題,可能是由於我對getRange()函數的工作方式缺乏了解。

我寫了兩個小的函數在Google表格中使用,但無法獲取單元格引用作為輸入正常工作。 這是代碼:

function getCellRGB(input, color) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];

  var cell = sheet.getRange(input);
  var hex = cell.getBackground();
  hex = hex.replace('#','');

  if (color == "r") return parseInt(hex.substring(0,2), 16);
  else if (color == "g") return parseInt(hex.substring(2,4), 16);
  else if (color == "b") return parseInt(hex.substring(4,6), 16);
  else return null;

}

僅當我這樣輸入時才有效:

getCellRGB("A1", "r")

如果我嘗試使用普通的單元格引用,如在其他函數中使用的那樣:

getCellRGB(A1, "r")

我收到錯誤消息“找不到范圍(第6行)”

第二個函數分別從一個單元格中的R,G和B值為一個單元格着色:

function setCellColorFromRGB(red,green,blue) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];

  var r = sheet.getRange(red);
  var g = sheet.getRange(green);
  var b = sheet.getRange(blue);

  cell.setBackgroundRGB(r, g, b)

}

對於這一行,我也得到了同樣的錯誤,也就是第6行。

更改此行

 var cell = sheet.getRange(input);

 var cell = sheet.getRange('"' + input + '"');

並且您應該在傳遞的值周圍加上引號。 您應該能夠對其他行執行相同的操作。

getRange()方法接受幾種不同類型的參數。 對於一個單元格,您有兩種選擇:a1表示法中的字符串或從1開始計數的兩個整數。

所以:

//these are valid and will get the top left most cell
var cell = sheet.getRange('A1');
var cell = sheet.getRange(1,1);

//this is not valid
var willNotWork = sheet.getRange(A1);

獲取單元格后,還需要調用.getValue(); 獲取單元格的內容。

感謝大家的努力,我已經設法設法找到解決方案。 錯誤比我想象的多得多。

首先,我第一個函數的代碼:

 function getCellRGB(sheet, row, col, color) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(sheet); var cell = sheet.getRange(row, col); var hex = cell.getBackground(); hex = hex.replace('#',''); if (color == "r") return parseInt(hex.substring(0,2), 16); else if (color == "g") return parseInt(hex.substring(2,4), 16); else if (color == "b") return parseInt(hex.substring(4,6), 16); else return null; } 

  1. 發行,輸入。 事實證明,當您像這樣在工作表中調用函數時:

    = getCellRGB(Sheet1,A1,A1,“ r”)

A1和B1實際上返回那些單元格的值,而不是對單元格本身的引用。 實際上,似乎沒有一種方法可以輕松地將單元格引用輸入到函數中。 我通過這樣的輸入解決了這個問題:

=getCellRGB(Sheet1 ROW(A1), COL(A1), "r")

這比較復雜,但是可以工作,甚至可以讓我在表格中“配方粘貼”。

  1. 輸入工作表必須輸入工作表所在的工作表所在的位置,因為我希望它可以位於電子表格中的不同工作表上,而不僅僅是同一工作表。

  2. 發出getRange()函數由於我認為使用它的唯一方法是將單元格引用作為字符串使用-getRange(“ A1”),所以花了一段時間。 盡管這是一種實現方式,但也可以輸入行和列,以輸入其中包含默認的ROW()和COL()函數。 那行得通。

因此,此代碼有效,並且我已使用它來輸出正確的變量,但是問題是,事實證明我實際上是在尋找一個持續運行的腳本,因為應該連續讀取和輸出RGB值,而不是在輸入時一次輸出功能。 這使得完全有必要使用不同的代碼,這實際上是一個不同的主題,但是由於它可以幫助人們實現相同的實現,因此這里是:

 function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var edit = ss.getSheetByName("Edit"); var calculation = ss.getSheetByName("Calculation"); var listenRange = edit.getRange("M2:M"); var applyRange = calculation.getRange("D2:F"); if (e.source.getSheetName() != "Edit") { //ss.toast('nopeSheet' + ":" + e.source.getSheetName()); return; } var row = e.range.getRow(); if (row < 2) { // ss.toast('nopeRow' + ":" + row); return; } var col = e.range.getColumn(); if (col < 10 || col > 10) { // ss.toast('nopeCol' + ":" + col); return; } var row = e.range.getRow(); var col = e.range.getColumn(); var cell = edit.getRange(row,col); var hex = cell.getBackground(); hex = hex.replace('#',''); var red = parseInt(hex.substring(0,2), 16); var green = parseInt(hex.substring(2,4), 16); var blue = parseInt(hex.substring(4,6), 16); var redCell = calculation.getRange("D" + row); redCell.setValue(red); var greenCell = calculation.getRange("E" + row); greenCell.setValue(green); var blueCell = calculation.getRange("F" + row); blueCell.setValue(blue); } 

那里有一些注釋掉的調試代碼,但是除此之外它不能正常觸發,因為背景顏色的改變顯然不會觸發onEdit。 致命的缺陷,但還是一個主題,它是另一個問題以及除顏色變化之外的所有內容的主題,它將起作用。

我還對工作表的引用和范圍進行了硬編碼,但是由於我僅將其專門用於此工作表,所以這應該沒有問題。

其次,關於我的另一段原始代碼-根據不同單元格中的RGB值設置單元格的背景色。 事實證明這是一個主要問題,因為功能顯然不允許基於另一個單元格中的值更改單元格背景色。 我設法通過以下兩個功能解決了這個問題:

 function rgbToHex(r,g,b) { var r = parseInt(r); var g = parseInt(g); var b = parseInt(b); if (g !== undefined) return Number(0x1000000 + r*0x10000 + g*0x100 + b).toString(16).substring(1); else return Number(0x1000000 + r[0]*0x10000 + r[1]*0x100 + r[2]).toString(16).substring(1); } 
來源: 如何在JavaScript中將小數轉換為十六進制?

 function setBgColor() { var s = SpreadsheetApp.getActive().getSheetByName("Calculation"); var targetrange = s.getRange('L2:L').setBackgrounds(s.getRange('K2:K').getValues()); } 
來源: https//productforums.google.com/forum/#!topic / docs / 88lWZY7WDZI

由於我只需要將此功能用作一次性功能,因此效果很好,但也可以轉換為其他功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM