You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					45 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					45 lines
				
				1.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								const colCache = require('./col-cache');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// const cellRefRegex = /(([a-z_\-0-9]*)!)?[$]?([a-z]+)[$]?([1-9][0-9]*)/i;
							 | 
						||
| 
								 | 
							
								const replacementCandidateRx = /(([a-z_\-0-9]*)!)?([a-z0-9_$]{2,})([(])?/gi;
							 | 
						||
| 
								 | 
							
								const CRrx = /^([$])?([a-z]+)([$])?([1-9][0-9]*)$/i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function slideFormula(formula, fromCell, toCell) {
							 | 
						||
| 
								 | 
							
								  const offset = colCache.decode(fromCell);
							 | 
						||
| 
								 | 
							
								  const to = colCache.decode(toCell);
							 | 
						||
| 
								 | 
							
								  return formula.replace(
							 | 
						||
| 
								 | 
							
								    replacementCandidateRx,
							 | 
						||
| 
								 | 
							
								    (refMatch, sheet, sheetMaybe, addrPart, trailingParen) => {
							 | 
						||
| 
								 | 
							
								      if (trailingParen) {
							 | 
						||
| 
								 | 
							
								        return refMatch;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      const match = CRrx.exec(addrPart);
							 | 
						||
| 
								 | 
							
								      if (match) {
							 | 
						||
| 
								 | 
							
								        const colDollar = match[1];
							 | 
						||
| 
								 | 
							
								        const colStr = match[2].toUpperCase();
							 | 
						||
| 
								 | 
							
								        const rowDollar = match[3];
							 | 
						||
| 
								 | 
							
								        const rowStr = match[4];
							 | 
						||
| 
								 | 
							
								        if (colStr.length > 3 || (colStr.length === 3 && colStr > 'XFD')) {
							 | 
						||
| 
								 | 
							
								          // > XFD is the highest col number in excel 2007 and beyond, so this is a named range
							 | 
						||
| 
								 | 
							
								          return refMatch;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        let col = colCache.l2n(colStr);
							 | 
						||
| 
								 | 
							
								        let row = parseInt(rowStr, 10);
							 | 
						||
| 
								 | 
							
								        if (!colDollar) {
							 | 
						||
| 
								 | 
							
								          col += to.col - offset.col;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (!rowDollar) {
							 | 
						||
| 
								 | 
							
								          row += to.row - offset.row;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        const res = (sheet || '') + (colDollar || '') + colCache.n2l(col) + (rowDollar || '') + row;
							 | 
						||
| 
								 | 
							
								        return res;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return refMatch;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = {
							 | 
						||
| 
								 | 
							
								  slideFormula,
							 | 
						||
| 
								 | 
							
								};
							 |