感謝所有回答我之前查詢的人,老實說我真的無法繼續使用 Google Apps 腳本 :-(
我想要做的相對簡單,對于 excel 上的 VBA 來說是輕而易舉的,但我猜床單是它自己的野獸。
我想做的是...
- 在“評論”單元格 B2:H 選項卡上閱讀來自谷歌表單的表單回復
- 將“評論”上 B 列中的唯一鍵回應與“儀表板”選項卡上 A1 中的唯一鍵進行比較
- 如果有匹配,我想將它們添加到 Cells G3:M20 的儀表板選項卡上
- 每次更改“儀表板”上的 A1 下拉串列時,這最終都會重繪
回應資料始終為 7 列,從字串到日期不等。有時 G & H 列會是空白的
真的很感謝這里的任何幫助,一旦我完成了這項作業,我就不必再觸摸 Google 表格了,哈哈
function bnbm() {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = SpreadsheetApp.getActive().getSheetByName("Comments");
var range = sheet.getRange("Comments!B2:H");
var values = range.getValues();
var values2 = values.filter(String);
var range2 = sheet.getRange("Dashboard!A1")
var rowd = range2.getValues();
var rowd2 = rowd.filter(String);
var result = sheet.getRange("Dashboard!G3:M20")
for (var i = 0; i < values2.length; i ) {
if (values2[i][0] == rowd2[0][0]) {
result.setValues(values2[i][1])
}
}
}
uj5u.com熱心網友回復:
我不認為你的結果陣列可以是固定長度,因為你評論下降 sh.getLastRow() 所以這就是我認為你想要的:
B2:H在 Apps Script 中使用類似范圍不是一個好主意,因為它們會在必須過濾掉的范圍末尾生成大量空資料。
function bnbm() {
const ss = SpreadsheetApp.getActive();
const csh = ss.getSheetByName("Comments");
const dsh = ss.getSheetByName('Dashboard');
const vs = csh.getRange(2, 2, csh.getLastRow() - 1, 7).getValues();
const A1 = dsh.getRange("A1").getValue();
let oA = [];//matches array
for (let i = 0; i < vs.length; i ) {
//if column B Comments = Dashboard A1
if (vs[i][0] == A1) {
oA.push(vs[i]);//save current row in matches array
}
}
if ((dsh.getLastRow() - 2) > 0) {
dsh.getRange(3, 7, dsh.getLastRow() - 2, 7).clearContent();//clear contents if any
}
if (oA.length > 0) {
dsh.getRange(3, 7, oA.length, oA[0].length).setValues(oA);//move matches to dashboard
ss.toast(`${oA.length}`, 'Matches');//number of matches
} else {
ss.toast('No Matches', 'Matches', 10);//no matches
}
}
示例評論資料集:
| COL1 | COL2 | COL3 | COL4 | COL5 | COL6 | COL7 | COL8 |
|---|---|---|---|---|---|---|---|
| 24 | 21 | 9 | 24 | 16 | 7 | 12 | 13 |
| 12 | 19 | 9 | 19 | 20 | 7 | 11 | 18 |
| 19 | 18 | 6 | 1 | 19 | 16 | 1 | 16 |
| 2 | 0 | 4 | 19 | 8 | 12 | 8 | 20 |
| 19 | 19 | 8 | 24 | 8 | 0 | 1 | 18 |
| 22 | 6 | 9 | 2 | 17 | 18 | 5 | 20 |
| 22 | 13 | 7 | 1 | 9 | 15 | 24 | 14 |
| 20 | 7 | 8 | 21 | 11 | 2 | 10 | 22 |
| 4 | 11 | 12 | 21 | 13 | 6 | 9 | 22 |
| 12 | 19 | 23 | 6 | 8 | 9 | 5 | 12 |
| 3 | 18 | 11 | 17 | 7 | 12 | 3 | 22 |
| 19 | 19 | 11 | 3 | 13 | 15 | 4 | 12 |
| 23 | 1 | 10 | 16 | 20 | 11 | 5 | 20 |
| 17 | 20 | 14 | 13 | 4 | 13 | 15 | 1 |
儀表板 A1 的結果 = 19;
| 19 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 19 | 9 | 19 | 20 | 7 | 11 | 18 | ||||||
| 19 | 8 | 24 | 8 | 0 | 1 | 18 | ||||||
| 19 | 23 | 6 | 8 | 9 | 5 | 12 | ||||||
| 19 | 11 | 3 | 13 | 15 | 4 | 12 | ||||||
| 19 | 24 | 13 | 11 | 9 | 19 | 9 |
添加此功能后,每次您在作業表 Dashboard 的 A1 中進行編輯時,bnbm 都會運行。
function onEdit(e) {
//e.source.toast('entry');
const sh = e.range.getSheet();
if(sh.getName() == 'Dashboard' && e.range.rowStart == 1 && e.range.columnStart == 1 && e.value) {
bnbm();
}
if(sh.getName() == "Dashboard" && e.range.rowStart == 1 && e.range.columnStart == 1 && e.value == null) {
e.source.toast('Invalid Input','Error Message');
}
}
我發現運行它的最簡單方法是將資料輸入 A1(僅限用戶編輯),然后單擊另一個單元格。點擊回車不會資料只是強制焦點回到空單元格并且不會完成編輯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/325125.html
