Created
March 17, 2023 02:43
-
-
Save smhmic/9ecf42ebb6d48af825f7fccc952590b4 to your computer and use it in GitHub Desktop.
G Apps Script - hyperlink list / multiple hyperlists in gsheet cell
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function onEdit(){ | |
const ss = SpreadsheetApp.getActive(); | |
const sheet = ss.getSheetByName('Table: MS OST'); | |
sheet.getRange(1,1).setValue( +new Date() ); | |
setCell_hyperlinkList( | |
sheet.getRange(12,2), | |
getNamedRange('ost.strategies'), | |
[], | |
'\n\n' ); | |
setCell_hyperlinkList( | |
sheet.getRange(13,2), | |
getNamedRange('ost.tactics'), | |
getNamedRange('ost.links'), | |
'\n\n' ); | |
}; | |
function setCell_hyperlinkList( cell, texts, urls, delimiter ){ | |
Logger.log( arguments ); | |
var | |
i, t, p, isFirst, // loop iteration vars | |
combinedText = '', // joins all text values with given delimiter | |
textMap = {}, // flags whether text has been used before to avoid duplicates | |
urlPositions = [], // keeps track of arguments for rtf.setLinkUrl | |
delimPositions = [], // keeps track of arguments for rtf.setTextStyle | |
delimStyle = SpreadsheetApp.newTextStyle().setFontSize(3).build(), | |
rtf = SpreadsheetApp.newRichTextValue(); | |
texts = flatten( texts ); | |
urls = flatten( urls ); | |
for( i=0; i<texts.length; i++ ){ | |
t = texts[i]; | |
urlPositions.push( null ); | |
delimPositions.push( null ); | |
if( t && t.length ){ | |
if( textMap.hasOwnProperty( t ) ) continue; textMap[t] = true; // Avoid duplicates | |
//isFirst = !combinedText.length | |
//if( !isFirst && delimiter.length ) | |
delimPositions[i] = [ combinedText.length, combinedText.length+delimiter.length ]; | |
//combinedText += isFirst ? t : delimiter+t; | |
combinedText += delimiter+t; | |
if( urls[i] && urls[i].length ) | |
urlPositions[i] = [ combinedText.length - t.length, combinedText.length ]; | |
} | |
} | |
delimPositions.push( [ combinedText.length+1, combinedText.length+delimiter.length ] ); | |
combinedText += delimiter; | |
texts.push(null); | |
rtf = rtf.setText( combinedText ); | |
for( i=0; i<texts.length; i++ ){ | |
if( p = delimPositions[i] ){ | |
Logger.log( 'Delim style: '+p[0]+" , "+p[1] ); | |
rtf = rtf.setTextStyle( p[0], p[1], delimStyle ); | |
} | |
if( p = urlPositions[i] ){ | |
//Logger.log( p[0]+" , "+p[1] ); | |
rtf = rtf.setLinkUrl( p[0], p[1], urls[i] ); | |
} | |
} | |
cell.setRichTextValue( rtf.build() ); | |
} | |
function flatten( list ){ | |
var r = [], i, j; | |
if( list.getValues ) list = list.getValues(); | |
for( i=0; i<list.length; i++ ){ | |
for( j=0; j<list[i].length; j++ ){ | |
r.push(list[i][j]); | |
} | |
} | |
return r; | |
} | |
function getNamedRange( name ){ | |
return SpreadsheetApp.getActiveSpreadsheet().getRangeByName(name); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment