我一直在嘗試使用以下功能來完成它,但沒有成功:
function moveLinks() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('SetRichTextValues via Apps Script');
const srcData = sheet.getRange("A2:E5").getValues();
const destHeaders = sheet.getRange("G2:K5").getValues();
const links1Col = destHeaders.indexOf('Links1');
const links2Col = destHeaders.indexOf('Links2');
const links3Col = destHeaders.indexOf('Links3');
let urlColIndexes = [links1Col, links2Col, links3Col];
urlColIndexes.forEach(function (colIndex) {
let data = srcData;
let col = colIndex;
let builders = data.map(r => {
let url = r[col];
while (url !== null) {
//if (url.indexOf('https') > -1) {
let builder = SpreadsheetApp.newRichTextValue().setText('LINK').setLinkUrl(url).build();
return [builder]
//} else {
return ['']
//}
}
});
sheet.getRange(3, colIndex 9, builders.length, 1).setRichTextValues(builders);
})
}
這是它的樣子(用戶界面):

如果您想玩代碼,腳本編輯器中的檔案名是:SetRichTextValues()... 在這個電子表格中。
uj5u.com熱心網友回復:
修改點:
- 在您的腳本中,
const destHeaders = sheet.getRange("G2:K5").getValues()是二維陣列。所以,links1Col,links2Col, 和links3Col總是-1。 - 而且,從您的顯示影像來看,這似乎
const destHeaders = sheet.getRange("G2:K5").getValues()是目的地范圍。在您的實際情況下,目標范圍的標題行已經位于“G2:K2”。在此答案中,它假定您的目標范圍具有標題行。 setRichTextValues在回圈中使用。在這種情況下,工藝成本會變高。
當這些點都體現在你的腳本中時,下面的修改怎么樣?
修改腳本:
此腳本使用 Sheets API。因此,請在 Advanced Google services 啟用 Sheets API。
function moveLinks() {
// Retrieve values.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('SetRichTextValues via Apps Script');
const srcData = sheet.getRange("A2:E5").getValues();
const objSrcData = srcData[0].map((_, c) => srcData.map(r => r[c])).reduce((o, [h, ...r]) => (o[h] = r, o), {});
const destHeaders = sheet.getRange("G2:K2").getValues()[0];
// Cell values.
const len = srcData[0].length;
const t1 = destHeaders.map(h => objSrcData[h] || Array(len).fill(null));
const cellValues = t1[0].map((_, c) => t1.map(r => r[c] || null));
// RichTextValues.
const noValue = SpreadsheetApp.newRichTextValue().setText("").build();
const richTextValues = cellValues.map(r => destHeaders.map((h, i) => h.includes("Links") ? (r[i] ? SpreadsheetApp.newRichTextValue().setText('LINK').setLinkUrl(r[i]).build() : noValue) : noValue));
// Put values.
const range = sheet.getRange(3, 7, richTextValues.length, richTextValues[0].length);
range.setRichTextValues(richTextValues);
SpreadsheetApp.flush();
Sheets.Spreadsheets.Values.update({ values: cellValues.map(r => destHeaders.map((h, i) => h.includes("Links") ? null : r[i])) }, ss.getId(), `'${sheet.getSheetName()}'!${range.getA1Notation()}`, { valueInputOption: "USER_ENTERED" });
}
- 運行此腳本時,將從“A2:E5”檢索源值。并且,目標標題行是從“G2:K2”中檢索的。并且,目標值被放入“G3:K”。
筆記:
在此修改中,假設目標區域具有標題行,并且標題標題與源區域的標題標題相同。請注意這一點。
在當前階段,
setRichTextValues不能使用null物件。所以,在這個修改中,為了以低處理成本放置單元格值,我使用了 Sheets API。如果您不想使用 Sheets API,請按如下方式修改上述腳本。
從
SpreadsheetApp.flush(); Sheets.Spreadsheets.Values.update({ values: cellValues.map(r => destHeaders.map((h, i) => h.includes("Links") ? null : r[i])) }, ss.getId(), `'${sheet.getSheetName()}'!${range.getA1Notation()}`, { valueInputOption: "USER_ENTERED" });至
const v = cellValues[0].map((_, c) => cellValues.map(r => [r[c]])); destHeaders.forEach((h, i) => { if (!h.includes("Links")) sheet.getRange(3, i 7, v[i].length).setValues(v[i]); });
當您更改電子表格的結構時,可能無法使用此修改后的腳本。請注意這一點。
參考:
- setRichTextValues(值)
- 地圖()
- 方法:電子表格.values.update
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/536454.html
標籤:谷歌应用脚本谷歌表格
