จะส่งช่วงไปยังฟังก์ชันที่กำหนดเองใน Google Spreadsheets ได้อย่างไร


44

ฉันต้องการสร้างฟังก์ชั่นที่ใช้ในช่วง ... สิ่งที่ชอบ:

function myFunction(range) {
  var firstColumn = range.getColumn();
  // loop over the range
}

เซลล์จะอ้างอิงโดยใช้:

=myFunction(A1:A4)

ปัญหาคือเมื่อฉันลองทำสิ่งนี้พารามิเตอร์ดูเหมือนว่ามันจะส่งผ่านค่าไปยังฟังก์ชันเท่านั้น ดังนั้นฉันไม่สามารถใช้ใด ๆ ของวิธีการช่วงgetColumn()เช่น เมื่อฉันพยายามทำมันจะให้ข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด: TypeError: ไม่สามารถหาฟังก์ชั่น getColumn ในวัตถุ 1,2,3

ฉันจะส่งช่วงจริงมากกว่าแค่ค่าไปยังฟังก์ชันที่กำหนดเองได้อย่างไร

คำตอบ:


22

ดังนั้นฉันจึงค้นหามานานและยากสำหรับคำตอบที่ดีสำหรับสิ่งนี้และนี่คือสิ่งที่ฉันได้พบ:

  1. พารามิเตอร์ช่วงที่ไม่ผ่านการแก้ไขจะส่งผ่านค่าของเซลล์ในช่วงไม่ใช่ช่วงของตัวเอง (ตามที่อธิบายไว้ใน Gergely) เช่นเมื่อคุณทำสิ่งนี้=myFunction(a1:a2)

  2. เพื่อใช้ช่วงในฟังก์ชั่นของคุณคุณต้องผ่านช่วงเป็นสตริง (เช่น:) =myFunction("a1:a2")ก่อนจากนั้นเปลี่ยนเป็นช่วงด้วยรหัสต่อไปนี้ภายในฟังก์ชั่น:

    Function myFunction(pRange){
      var sheet = SpreadsheetApp.getActiveSpreadsheet();
      var range = sheet.getRange(pRange);
    }
    
  3. สุดท้ายหากคุณต้องการได้รับประโยชน์จากการส่งในช่วง (เช่นคัดลอกช่วงอ้างอิงอย่างชาญฉลาดไปยังเซลล์อื่น ๆ ) และคุณต้องการที่จะผ่านมันเป็นสตริงคุณต้องใช้ฟังก์ชั่นเริ่มต้นที่ยอมรับช่วงเป็นพารามิเตอร์และผลลัพธ์ สตริงที่คุณสามารถใช้ ฉันแสดงรายละเอียดทั้งสองวิธีที่พบด้านล่าง แต่ฉันชอบอันดับที่ 2

    สำหรับสเปรดชีต Google ทั้งหมด: =myFunction(ADDRESS(row(A1),COLUMN(A1),4)&":"&ADDRESS(row(A2),COLUMN(A2),4));

    สำหรับ Google ชีตใหม่: =myFunction(CELL("address",A1)&":"&CELL("address",A2));


คุณช่วยอธิบายรายละเอียดเกี่ยวกับสิ่งที่ "คัดลอกช่วงอ้างอิงอย่างชาญฉลาดไปยังเซลล์อื่น" หมายถึงโปรด?
Emerson Farrugia

ผู้ช่วยชีวิต มันใช้งานได้ดีขอบคุณ
Jithin Pavithran

@EmersonFarrugia ฉันหมายถึงความสามารถของ Google ชีตในการอัปเดตการอ้างอิงเซลล์โดยอัตโนมัติเมื่อคุณคัดลอกฟังก์ชั่นจากเซลล์หนึ่งไปยังอีกเซลล์หนึ่ง
Nathan Hanna

9

rangeถือว่าเป็นอาร์เรย์ 2d ของ javascript คุณจะได้รับจำนวนแถวด้วยและจำนวนคอลัมน์ที่มีrange.length range[0].lengthหากคุณต้องการที่จะได้รับค่าจากแถวrและคอลัมน์ใช้งาน:crange[r][c]


ฉันพยายามค้นหาว่าคอลัมน์แรกในช่วงนั้นคืออะไร ตัวอย่างเช่นในช่วง C1: F1 ฉันต้องการทราบว่าช่วงเริ่มต้นในคอลัมน์ C
Senseful

@Senseful ถ้าคุณจะใช้ฟังก์ชั่นของคุณในเซลล์เช่น: =myFunction(C1:F1)แล้วภายในฟังก์ชั่นrange[0][0]จะกลับค่าของC1, range[0][1]จะกลับค่าของD1, range[0][2]จะกลับค่าของE1ฯลฯ .. คือที่ชัดเจน?
Lipis

ฉันคิดว่าฉันไม่ได้อธิบายตัวเองอย่างชัดเจน ... ดูคำตอบของคุณสำหรับคำถามนี้ คุณแนะนำให้ฉันใช้=weightedAverage(B3:D3,$B$2:$D$2)ฉันต้องการที่จะทำให้ฟังก์ชั่นการพิสูจน์ข้อผิดพลาดมากขึ้นโดยไม่ต้องส่งอาร์กิวเมนต์ที่ 2 (เช่นฉันต้องการที่จะเรียกมันว่าเป็น=weightedAverage(B3:D3)) แล้วให้รหัสโดยอัตโนมัติรู้ว่าช่วงเริ่มต้นที่ B และสิ้นสุดที่ D ดังนั้นมันจะได้รับค่าที่สอดคล้องกันจากแถวที่ 2 หมายเหตุ: ค่า "2" สามารถฮาร์ดโค้ดได้ แต่ "B" ไม่ควรฮาร์ดโค้ด
เหตุผล

1
@Senseful โดยทั่วไปฉันเทียบกับฮาร์ดโค้ดและฉันคิดว่ามันชัดเจนกว่าถ้าค่าเฉลี่ยถ่วงน้ำหนักจะใช้พารามิเตอร์สองอัน ดังนั้นหากคุณกำลังจะโค้ดยากแล้วมีสิ่งอื่น ๆ อีกมากมายที่คุณสามารถทำได้ ฉันไม่สามารถหาได้ในขณะนี้วิธีการที่เราจะได้รับจากที่กำหนดB rangeฉันขอแนะนำให้คุณอ่านคู่มือการเริ่มต้นใช้งาน ( goo.gl/hm0xT ) หากคุณยังไม่ได้รับความคิดเกี่ยวกับวิธีเล่นกับช่วงและเซลล์
Lipis

6

เมื่อส่ง a Rangeไปยังฟังก์ชันสเปรดชีตของ Google เฟรมเวิร์กจะดำเนินการparamRange.getValues()โดยปริยายและฟังก์ชันของคุณจะได้รับค่าในช่วงเป็นอาร์เรย์สองมิติของสตริงตัวเลขหรือวัตถุ (เช่นDate) Rangeวัตถุไม่ได้ส่งผ่านไปยังฟังก์ชั่นสเปรดชีทของคุณเอง

TYPEOF()ฟังก์ชั่นดังต่อไปนี้จะบอกคุณว่าชนิดของข้อมูลที่คุณได้รับเป็นพารามิเตอร์ สูตรสำเร็จ

=TYPEOF(A1:A4)

จะเรียกใช้สคริปต์เช่นนี้:

ฟังก์ชั่น calculCell () {
  var resultCell = SpreadsheetApp.getActiveSheet (). getActiveCell ();
  var paramRange = SpreadsheetApp.getActiveSheet (). getRange ('A1: A4');
  var paramValues ​​= paramRange.getValues ​​();

  var resultValue = TYPEOF (paramValues);

  resultCell.setValue (resultValue);
}
ฟังก์ชัน TYPEOF (ค่า) {
  if (ค่า typeof! == 'object')
    คืนค่า typeof;

  var details = '';
  if (value instanceof Array) {
    details + = '[' + value.length + ']';
    if (value [0] instanceof Array)
      details + = '[' + ค่า [0] .length + ']';
  }

  var className = value.constructor.name;
  ส่งคืน className + รายละเอียด;
}

3

เป็นอีกทางเลือกแรงบันดาลใจจากความคิดเห็นจาก @Lipis คุณสามารถเรียกใช้ฟังก์ชันของคุณโดยใช้พิกัดแถว / คอลัมน์เป็นพารามิเตอร์เพิ่มเติม:

=myFunction(B1:C2; ROW(B1); COLUMN(B1); ROW(C2); COLUMN(C2))

ในฟอร์มนี้สูตรสามารถคัดลอก (หรือลาก) ไปยังเซลล์อื่นได้อย่างง่ายดายและการอ้างอิงเซลล์ / ช่วงจะถูกปรับโดยอัตโนมัติ

ฟังก์ชันสคริปต์ของคุณจะต้องได้รับการอัปเดตดังนี้:

function myFunction(rangeValues, startRow, startColumn, endRow, endColumn) {
  var range = SpreadsheetApp.getActiveSheet().getRange(startRow, startColumn, endRow - startRow + 1, endColumn - startColumn + 1);
  return "Range: " + range.getA1Notation();
}

โปรดทราบว่าgetRangeฟังก์ชั่นใช้เวลาstartRow, startColumnและจากนั้นจำนวนแถวและจำนวนคอลัมน์ - ไม่จบแถวและท้ายคอลัมน์ ดังนั้นการคำนวณ


นั่นคือคำตอบที่ฉันคาดหวัง ROW และ COLUMN
Jianwu เฉิน

3

ซึ่งสามารถทำได้ หนึ่งสามารถรับการอ้างอิงถึงช่วงที่ผ่านไปโดยการแยกสูตรในเซลล์ที่ใช้งานซึ่งเป็นเซลล์ที่มีสูตร นี้จะทำให้สมมติฐานที่ว่าฟังก์ชั่นที่กำหนดเองที่ใช้ในของตัวเองและไม่ได้เป็นส่วนหนึ่งของการแสดงออกที่ซับซ้อนมากขึ้น: เช่นไม่=myfunction(A1:C3)=sqrt(4+myfunction(A1:C3))

ฟังก์ชันนี้ส่งคืนดัชนีคอลัมน์แรกของช่วงที่ส่งผ่าน

function myfunction(reference) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var args = formula.match(/=\w+\((.*)\)/i)[1].split('!');
  try {
    if (args.length == 1) {
      var range = sheet.getRange(args[0]);
    }
    else {
      sheet = ss.getSheetByName(args[0].replace(/'/g, ''));
      range = sheet.getRange(args[1]);
    }
  }
  catch(e) {
    throw new Error(args.join('!') + ' is not a valid range');
  }

  // everything so far was only range extraction
  // the specific logic of the function begins here

  var firstColumn = range.getColumn();  // or whatever you want to do with the range
  return firstColumn;
}

ฉันคิดว่าโพสต์นี้ยังตอบคำถามต่อไปนี้ในStack Overflow : ส่งผ่านการอ้างอิงเซลล์ไปยังฟังก์ชันสเปรดชีต
Rubén

2

ฉันได้ขยายแนวคิดที่ยอดเยี่ยมในคำตอบของผู้ใช้ 79865 เพื่อให้มันทำงานได้หลายกรณีและมีการส่งผ่านข้อโต้แย้งจำนวนมากไปยังฟังก์ชันที่กำหนดเอง

หากต้องการใช้งานให้คัดลอกโค้ดด้านล่างจากนั้นในการเรียกใช้ฟังก์ชันที่กำหนดเองของคุณGetParamRanges()เช่นนี้ให้ส่งชื่อฟังก์ชันของคุณ:

function CustomFunc(ref1, ref2) {

  var ranges = GetParamRanges("CustomFunc"); // substitute your function name here

  // ranges[0] contains the range object for ref1 (or null)
  // ranges[1] contains the range object for ref2 (or null)

  ... do what you want

  return what_you_want;
}

นี่คือตัวอย่างเพื่อส่งคืนสีของเซลล์:

/**
* Returns the background color of a cell
*
* @param {cell_ref} The address of the cell
* @return The color of the cell
* @customfunction
*/
function GetColor(ref) {

  return GetParamRanges("GetColor")[0].getBackground();
}

นี่คือรหัสและคำอธิบายเพิ่มเติม:

/**
* Returns an array of the range object(s) referenced by the parameters in a call to a custom function from a cell
* The array will have an entry for each parameter. If the parameter was a reference to a cell or range then 
* its array element will contain the corresponding range object, otherwise it will be null.
*
* Limitations:
* - A range is returned only if a parameter expression is a single reference.
*   For example,=CustomFunc(A1+A2) would not return a range.
* - The parameter expressions in the cell formula may not contain commas or brackets.
*   For example, =CustomFunc(A1:A3,ATAN2(4,3),B:E) would not parse correctly.
* - The custom function may not appear more than once in the cell formula.
* - Sheet names may not contain commas, quotes or closing brackets.
* - The cell formula may contain white space around the commas separating the custom function parameters, or after
*   the custom function name, but not elsewhere within the custom function invocation.
* - There may be other limitations.
* 
* Examples:
*   Cell formula: =CUSTOMFUNC($A$1)
*   Usage:        var ranges = GetParamRanges("CustomFunc");
*   Result:       ranges[0]: range object for cell A1 in the sheet containing the formula
*
*   Cell formula: =CUSTOMFUNC(3, 'Expenses'!B7)
*   Usage:        var ranges = GetParamRanges("CustomFunc");
*   Result:       ranges[0]: null
*                 ranges[1]: range object for cell B7 in sheet Expenses
* 
*   Cell formula: =sqrt(4+myfunction(A1:C3))
*   Usage:        var ranges = GetParamRanges("MyFunction");
*   Result:       ranges[0]: range object for cells A1 through C3 in the sheet containing the formula
*
*   Cell formula: =CustomFunc(A1+A2, A1, A2)
*   Usage:        var ranges = GetParamRanges("CustomFunc");
*   Result:       ranges[0]: null
*                 ranges[1]: range object for cell A1 in the sheet containing the formula
*                 ranges[2]: range object for cell A2 in the sheet containing the formula
*
* @param {funcName} The name of the custom function (string, case-insensitive)
* @return The range(s) referenced by the parameters to the call
*/
function GetParamRanges(funcName) {
  var ourSheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var re = new RegExp(".+" + funcName + "\\s*\\((.*?)\\)","i");
  var ranges=[]; // array of results

  try {
    var args = formula.match(re)[1].split(/\s*,\s*/) // arguments to custom function, separated by commas
    // if there are no args it fails and drops out here

    for (var i=0; i<args.length; i++) {
      var arg=args[i].split('!'); // see if arg has a sheet name
      try {
        if (arg.length == 1) { // if there's no sheet name then use the whole arg as the range definition
          ranges[i] = ourSheet.getRange(arg[0]);
        }
        else { // if there's a sheet name, use it (after removing quotes around it)
          var sheetName=arg[0].replace(/'/g, '');
          var otherSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
          ranges[i] = otherSheet.getRange(arg[1]);
        }
      }
      catch(e) { // assume it couldn't be identified as a range for whatever reason
        ranges[i]=null;
      }
    }
  }
  catch(e) {}

  return ranges
}

1
ไม่เลวเลย แต่โปรดระบุว่าสิ่งนี้ทำให้สมมติฐานว่าฟังก์ชั่นการเผาไหม้ใช้เพียงครั้งเดียวในสูตร Fi ฉันต้องใช้ forumals เช่น: = CountCcolor (B5: B38, $ A40) / 2 + CountCcolor (B5: B38, $ A41) / 2 + CountCcolor (B5: B38, $ A42) / 2 + CountCcolor (B5: B38 , $ A43) / 2 + CountCcolor (B5: B38, $ A44) / 2 ซึ่งจากที่ฉันเข้าใจจะไม่ทำงานด้วยวิธีนี้ ถ้าเราแก้มันได้ก็สามารถจัดการกับมันได้มันจะดีมาก
haemse

1

ฉันเห็นความแตกต่างของฟังก์ชั่นที่กำหนดเองสองแบบใน Google Spreadsheet ผ่าน Google Apps Script:

  1. หนึ่งที่เรียกใช้ API SpreadsheetApp ( ตัวอย่าง )
  2. สายที่ไม่ทำการโทร ( ตัวอย่าง )

ฟังก์ชั่นแรกสามารถทำอะไรได้เกือบทุกอย่าง นอกเหนือจากการเรียกใช้บริการสเปรดชีตมันสามารถโทรหา GmailApp หรือบริการใด ๆ ที่ให้บริการโดย Google การเรียก API จะทำให้กระบวนการช้าลง สามารถส่งผ่านช่วงหรือดึงข้อมูลผ่านฟังก์ชันเพื่อเข้าถึงวิธีการทั้งหมดที่มี

ฟังก์ชั่นที่สองนั้น จำกัด อยู่ที่ "สเปรดชีต" เท่านั้น ที่นี่หนึ่งสามารถใช้ JavaScript เพื่อทำใหม่ข้อมูล ฟังก์ชั่นเหล่านี้ปกติแล้วจะเร็วมาก ช่วงที่ผ่านไม่มีอะไรมากไปกว่าค่าอาร์เรย์สองมิติที่มีค่า


ในคำถามของคุณคุณเริ่มต้นด้วยการโทรหา.getColumn()วิธีการ สิ่งนี้บ่งชี้อย่างชัดเจนว่าคุณต้องการฟังก์ชั่นที่กำหนดเองประเภท 1 ดังที่อธิบายไว้ข้างต้น

ดูคำตอบต่อไปนี้เกี่ยวกับวิธีตั้งค่าสเปรดชีตและแผ่นงานเพื่อสร้างฟังก์ชันที่กำหนดเอง


1

ฉันทำงานนี้เมื่อไม่กี่เดือนที่ผ่านมาและมาพร้อมกับ kludge ที่ง่ายมาก: สร้างชีตใหม่ที่มีชื่อของแต่ละเซลล์ตามเนื้อหา: เซลล์ A1 สามารถมีลักษณะดังนี้:

= arrayformula(cell("address",a1:z500))

ตั้งชื่อชีต "Ref" จากนั้นเมื่อคุณต้องการการอ้างอิงไปยังเซลล์เป็นสตริงแทนที่จะเป็นเนื้อหาคุณจะใช้:

= some_new_function('Ref'!C45)

แน่นอนคุณจะต้องตรวจสอบว่าฟังก์ชั่นได้รับการส่งผ่านสตริง (หนึ่งเซลล์) หรือ 1D หรือ 2 อาร์เรย์ หากคุณได้รับอาร์เรย์มันจะมีที่อยู่เซลล์ทั้งหมดเป็นสตริง แต่จากเซลล์แรกและความกว้างและความสูงคุณสามารถทราบได้ว่าคุณต้องการอะไร


0

ฉันทำงานทุกเช้านี้และเห็นหลักฐานของสิ่งที่ไม่มีคำตอบข้างต้นพูดถึง มีเหตุผลและฉันต้องการ ADDRESS ของเซลล์ที่ส่งผ่านไม่ใช่ค่า และคำตอบนั้นง่ายมาก ไม่สามารถทำได้

ฉันพบวิธีแก้ไขปัญหาบางอย่างที่ต้องพึ่งพาการหาว่าเซลล์ใดมีสูตรอยู่ เป็นการยากที่จะบอกว่าสิ่งนี้จะช่วยให้มีเหตุผลด้านบน แล้วฉันกำลังทำอะไร

The data.

     [A]      [B]       [C]       [D]     [E]     [F]       [H]
[1] Name      Wins     Losses    Shots   Points   Fouls   Most recent
                                                          WL Ratio
[2] Sophia     4         2         15      7       1         0
[3] Gloria     11        3         11      6       0         0
[4] Rene       2         0         4       0       0         0
[5] Sophia     7         4         18      9       1         1.5

คอลัมน์ H คือโซเฟีย (ชนะ - PrevWins) / (ขาดทุน - PrevLosses)

(7 - 4) / (4 - 2) = 1.5

แต่เราไม่ทราบว่าแถวใดที่โซเฟียเคยปรากฏมาก่อนหน้า
นี้ทุกสิ่งสามารถทำได้โดยใช้ VLOOKUP หากคุณฮาร์ดโค้ด A เป็นคอลัมน์ชื่อ หลังจาก VLOOKUP ฉันได้รับ #NA (ไม่พบชื่อ) และ # DIV0 (ศูนย์ส่วน) และห่อด้วย = IF (IF (... )) เพื่อแสดงข้อความที่น่าพึงพอใจมากขึ้นในเงื่อนไขเหล่านี้ ตอนนี้ฉันมีการแสดงออกอย่างมหึมาอย่างไม่น่าเชื่อและไม่สามารถบำรุงรักษาได้ ดังนั้นฉันต้องการการขยายมาโคร (ไม่มีอยู่) หรือฟังก์ชั่นที่กำหนดเอง

แต่เมื่อฉันทำผู้ช่วย SubtractPrevValue (มือถือ) มันได้รับ "7" แทนที่จะเป็น B5 ไม่มีวิธีการรับเซลล์หรือวัตถุในตัวจากอาร์กิวเมนต์ที่ส่งผ่าน
ถ้าฉันทำให้ผู้ใช้ป้อนชื่อเซลล์ด้วยเครื่องหมายคำพูดคู่ด้วยตนเองฉันสามารถทำได้ ... SubtractPrevValue ("B5") แต่นั่นคือการคัดลอก / วางและคุณสมบัติของเซลล์สัมพัทธ์จริงๆ

แต่แล้วฉันก็พบวิธีแก้ปัญหา

SpreadsheetApp.getActiveRange () เป็นเซลล์ที่มีสูตร นั่นคือทั้งหมดที่ฉันต้องการรู้ หมายเลขแถว ฟังก์ชั่นต่อไปนี้ใช้หมายเลขคอลัมน์ NUMERIC และลบการเกิดขึ้นก่อนหน้าในคอลัมน์นั้น

function SubtractPrevValue(colNum) 
{
  var curCell = SpreadsheetApp.getActiveRange();
  var curSheet = curCell.getSheet();
  var curRowIdx = curCell.getRowIndex();
  var name = curSheet.getRange(curRowIdx, 1).getValue();  // name to match
  var curVal =  curSheet.getRange(curRowIdx, colNum).getValue();

  var foundRowIdx = -1;
  for (var i=curRowIdx-1;i>1;i--)
  { 
    if (curSheet.getRange(i, 2).getValue() == name)
    {
      return curVal - curSheet.getRange(i, colNum).getValue();
    }
  }
  return curVal;  //default if no previous found
}

แต่แล้วฉันก็ค้นพบว่ามันช้ามากจริงๆ ความล่าช้าหนึ่งและสองวินาทีในขณะที่มันแสดง "กำลังคิด ... " ดังนั้นฉันจึงกลับไปที่สูตรเวิร์กชีทที่อ่านไม่ออกอย่างหนาแน่นและไม่สามารถทำลายได้


0

แทนที่จะให้วัตถุ "พิสัย" นักพัฒนาของ Google จะผ่านประเภทข้อมูลแบบสุ่ม ดังนั้นฉันจึงพัฒนามาโครต่อไปนี้เพื่อพิมพ์ค่าของอินพุต

function tp_detail(arg)
{
    var details = '';

    try
    {
        if(typeof arg == 'undefined')
           return details += 'empty';

        if (typeof arg !== 'object')
        {
            if (typeof arg == 'undefined')
                return details += 'empty';

            if (arg.map)
            {
                var rv = 'map: {';
                var count = 1;
                for (var a in arg)
                {
                    rv += '[' + count + '] ' + tp_detail(a);
                    count = count + 1;
                }
                rv += '}; '
                return rv;
            }
            return (typeof arg) + '(\'' + arg + '\')';
        }


        if (arg instanceof Array)
        {
            details += 'arr[' + arg.length + ']: {';
            for (var i = 0; i < arg.length; i++)
            {
                details += '[' + i + '] ' + tp_detail(arg[i]) + ';';
            }
            details += '} ';
        }
        else
        {

            var className = arg.constructor.name;
            return className + '(' + arg + ')';
        }
    }
    catch (e)
    {
        var details = '';
        details = 'err : ' + e;
    }


    return details;
}

0

มีการรวบรวมคำตอบก่อนหน้าของฉัน

**
 *
 * @customfunction
 **/
function GFR(){
  var ar = SpreadsheetApp.getActiveRange();
  var as = SpreadsheetApp.getActive();
  return ar.getFormula()
    .replace(/=gfr\((.*?)\)/i, '$1')
    .split(/[,;]/)
    .reduce(function(p, a1Notation){
      try{
        var range = as.getRange(a1Notation);
        p.push(Utilities.formatString(
          'Is "%s" a Range? %s', 
          a1Notation,
          !!range.getDisplayValues
        ));
      } catch(err){
        p.push([a1Notation + ' ' + err.message]);
      }
    return p;
  },[]);
}

ใช้สูตรปัจจุบันและตรวจสอบว่าเป็นช่วงหรือไม่

=GFR(A1:A5;1;C1:C2;D1&D2) ผลตอบแทน

|Is "A1:A5" a Range? true|
|1 Range not found       |
|Is "C1:C2" a Range? true|
|D1&D2 Range not found   |

สำหรับองค์ประกอบที่สมบูรณ์ TC สามารถเรียกสิ่งนี้ได้

var range = as.getRange(a1Notation);
var column = range.getColumn();

-1

สร้างฟังก์ชั่นและช่วงการส่งผ่านเป็นอาร์กิวเมนต์:

function fn(input) {
    var cell = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange(SpreadsheetApp.getActiveRange().getFormula().match(/=\w+\((.*)\)/i)[1].split('!'));
    // above ... cell is "range", can convert to array?
    var sum=0;
    for (var i in cell.getValues() ){
        sum = sum + Number(cell.getValues()[i]);
    }  
    return sum;
}

การใช้งานในสเปรดชีต:

=fn(A1:A10)

sum(A1:A10)มันจะแสดงค่าเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.