顯示具有 雲端硬碟 標籤的文章。 顯示所有文章
顯示具有 雲端硬碟 標籤的文章。 顯示所有文章

2024/2/17

第一次用Gemini 1.5寫Google Apps Script以進行Google 試算表的自動化

 

為了自動列出雲端硬碟上某個資料夾的使用者,問了ChatGPT一個問題:

我有一個google試算表。試算表的B1儲存格存放的資料是一個google雲端硬碟上的資料夾的連結,例如:
https://drive.google.com/drive/u/0/folders/XXXXXXXXXXXXXXXXXXXX
我需要一個script來完成以下工作:

1. 先清除B2:B100的資料。
2. 在B2顯示資料夾名稱。
3. 在B3顯示資料夾所有者。
4. 在B4、B5、B6...列出資料夾編輯者。
5. 列完編輯者之後,接著再列出檢視者。
 

ChatGPT給的程式碼執行後一直出現錯誤,無法順利執行,再三反饋給ChatGPT,多次修改後仍無效,放棄。

想到Google幾天前啟用的Gemini 1.5,以下是Gemini的答案與修改過程:

好的,以下是一個可以完成您需求的 Google Apps Script:

```
function getFolderInfo() {
  // 清除 B2:B100 的資料
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange('B2:B100').clearValues();

  // 取得資料夾 ID
  var folderId = sheet.getRange('B1').getValue().match(/folders\/(.*)/)[1];

  // 取得資料夾資訊
  var folder = DriveApp.getFolderById(folderId);

  // 顯示資料夾名稱
  sheet.getRange('B2').setValue(folder.getName());

  // 顯示資料夾所有者
  sheet.getRange('B3').setValue(folder.getOwner().getEmail());

  // 顯示資料夾編輯者
  var editors = folder.getEditors();
  for (var i = 0; i < editors.length; i++) {
    sheet.getRange('B' + (4 + i)).setValue(editors[i].getEmail());
  }

  // 顯示資料夾檢視者
  var viewers = folder.getViewers();
  for (var i = 0; i < viewers.length; i++) {
    sheet.getRange('B' + (4 + editors.length + i)).setValue(viewers[i].getEmail());
  }
}
```

這個 Script 的執行方式如下:

1. 在 Google 試算表中,開啟 Script 編輯器。
2. 將上述程式碼貼到 Script 編輯器中。
3. 儲存 Script。
4. 在 Script 編輯器中,點選執行按鈕。

執行 Script 後,試算表中的 B2:B100 儲存格就會顯示出您指定的資料夾的相關資訊。

以下是 Script 的詳細說明:

* `getFolderInfo()` 函式是 Script 的入口點。
* `sheet.getRange('B2:B100').clearValues()` 這一行用於清除 B2:B100 儲存格中的資料。
* `var folderId = sheet.getRange('B1').getValue().match(/folders\/(.*)/)[1]` 這一行用於取得資料夾 ID。
* `var folder = DriveApp.getFolderById(folderId)` 這一行用於取得資料夾物件。
* `sheet.getRange('B2').setValue(folder.getName())` 這一行用於顯示資料夾名稱。
* `sheet.getRange('B3').setValue(folder.getOwner().getEmail())` 這一行用於顯示資料夾所有者。
* `var editors = folder.getEditors()` 這一行用於取得資料夾編輯者陣列。
* `for (var i = 0; i < editors.length; i++) { sheet.getRange('B' + (4 + i)).setValue(editors[i].getEmail()) }` 這一行用於顯示資料夾編輯者。
* `var viewers = folder.getViewers()` 這一行用於取得資料夾檢視者陣列。
* `for (var i = 0; i < viewers.length; i++) { sheet.getRange('B' + (4 + editors.length + i)).setValue(viewers[i].getEmail()) }` 這一行用於顯示資料夾檢視者。

希望這個 Script 能夠滿足您的需求。

我:執行後出現錯誤訊息:TypeError: sheet.getRange(...).clearValues is not a function

Gemini:

出現這個錯誤訊息的原因是,您使用的 Google Apps Script 版本太舊了。在舊版本的 Google Apps Script 中,`sheet.getRange()` 方法沒有 `clearValues()` 函式。

要解決這個問題,您需要將 Google Apps Script 版本更新到最新版本。更新方法如下:

1. 在 Google 試算表中,開啟 Script 編輯器。
2. 點選 **資源** > **管理 Script 版本**。
3. 在 **版本** 對話方塊中,點選 **更新**。

更新 Google Apps Script 版本後,您應該就可以正常執行 Script 了。

如果您不想更新 Google Apps Script 版本,也可以使用以下方法來清除 B2:B100 儲存格中的資料:

```
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange('B2:B100');
range.clearContent();
```

`clearContent()` 方法的效果與 `clearValues()` 方法相同,但它適用於所有版本的 Google Apps Script。

採用Gemini提供的第二個方案,修改程式碼之後就能順利執行了,不虧是自家產品,對自家的試算表有較好的支援。

相較於GhatGPT,Gemini第二次回覆就成功了,而且每段程式碼還一一解釋,非常適合學習電腦語言,超棒der~~~

 

2023/12/3

超級無敵好用,今天與ChatGPT的對話


使用chatGPT3.5協助電腦工作已經有一陣子了,心得就一個字:神!大概是我用過最厲害的應用,每一次GPT寫的代碼全都能滿願,讓我這個程式小白也能享受一點執行程式的樂趣,真的是太棒了!今天的對話如下:

Me: 在google試算表的script中,我有一段程式碼如下:

function hideDataRows() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var dataRange = sheet.getRange("D2:D" + sheet.getLastRow());
   // 假設資料從第二列開始,D欄
  var dataValues = dataRange.getValues();
  for (var i = 0; i < dataValues.length; i++) {
    var row = i + 2;
     // 資料索引 + 2,因為索引從0開始,而實際的列從2開始
    var rowData = dataValues[i][0];
    if (rowData !== "") {
      sheet.hideRows(row);
    }

  }
}

我想在程式碼的開頭加入執行的條件:如果G1儲存格內的字串包含"ok",那麼就繼續往下執行,否則就停止執行。該怎麼改寫呢?

GPT秒答:

您可以在程式碼的開頭加入一個條件判斷,檢查 G1 儲存格的值是否包含 "ok"。如果不包含,則停止執行,否則繼續執行。以下是修改後的程式碼:
function hideDataRows() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 檢查 G1 儲存格的值是否包含 "ok" var conditionCell = sheet.getRange("G1"); var conditionValue = conditionCell.getValue(); if (conditionValue.indexOf("ok") === -1) { // 如果 G1 儲存格的值不包含 "ok",則停止執行 return; } var dataRange = sheet.getRange("D2:D" + sheet.getLastRow()); var dataValues = dataRange.getValues(); for (var i = 0; i < dataValues.length; i++) { var row = i + 2; var rowData = dataValues[i][0]; if (rowData !== "") { sheet.hideRows(row); } } }

這樣修改後,當 G1 儲存格的值不包含 "ok" 時,程式碼將會在條件判斷處停止執行,否則將繼續執行隱藏資料列的操作。

以下是其他chatGPT成功幫我解決的問題(皆列出原始提示): 

我有一個google sheets工作表,A欄是日期,如果日期是今天以前的日期,且迄今已超過7天,就隱藏該列,請問script應該怎麼寫?

我想在google試算表中寫一個script,讓我可以隱藏工作表C欄中除了第一列之外,所有包含資料的列,程式碼應該怎麼寫呢?

2020/11/16

用image函數在google試算表中顯示報名者上傳到google表單中的照片或大頭照

舉辦活動時,利用google表單傳送報名資料已經成了一種趨勢,不僅省時也非常環保,有時候我們還可要求報名者上傳證件大頭照,當然這難不倒google表單,但我們收到的報名資料在試算表中會是這個樣子:

沒辦法一眼看到報名者上傳的圖檔,只有圖檔連結。如果要看到照片的話,要將滑鼠移動到連結上懸停,才會跑出報名者的大頭照:

這樣很不直觀,也不能把照片列印出來上呈,這時候就要使用image這個函數了。步驟如下:


1. 首先將存放上傳照片的資料夾權限開啟成「知道連結的使用者」:

2. 將「表單回應」複製成一般工作表:

3. 在複製好的工作表中,新增用來顯示照片的D欄:

4. 在D2儲存格中貼上以下函數:

=image(concatenate("http://drive.google.com/uc?export=view&id=",RIGHT(C2,33)),1)

image函數的語法是:IMAGE(網址, [模式], [高度], [寬度]) 

這裡用到的參數是[模式],1是依照原圖比例顯示,2是將照片拉伸並填滿儲存格。通常大頭照我們都不希望人像比例變形,所以使用1。D2貼上函數後,應該就可以看到照片跑出來了,將D2函數複製到最後一列,即可將所有報名者的大頭照在D欄顯示出來:

照片很小張,沒關係,最後再加大列高與欄寬,就可放大顯示全部大頭照。

2018/6/11

google試算表獨家函數(excel不會)—regexextract抽取字串中的數字

在處理資料的時候,有時必須抽取出字串中的數字部份,如果資料格式整齊一致,在excel中可以用len、left、right、search等簡單函數處理。

但如果資料是這樣:
105
A50
BB7
CCC125
42
7

那麼就需要使用excel的陣列公式,例如這個教學。不過陣列公式並不容易理解,寫起來不但傷腦筋還有限制。但如果使用google試算表,那麼使用regexextract這個獨家函數(regular expression extract的縮寫)配合正規表示式,寫起來就非常直觀了。

假設有以下影集名稱資料,需要抽取其中的集數:

資料非常不整齊,唯一可以用的規律是集數皆為阿拉伯數字,如果用excel的陣列公式會很難寫。先把資料貼到google試算表,並使用公式如下:
這個公式中,[0-9]+是正則表達式,可以辨識字串中第一次出現的數字,輸出結果如上例B欄,其格式預設為文字,所以會保留數字前面的0。如果需轉為數字格式,則在公式後多寫+0即可:
輸出如C欄所示。結果可貼回excel。

除了抽取數字,這個函數的用途應該很廣,只要是可以用正則表達式描述的字串,例如英文字母、電話號碼、身份證字號等等,皆可用regexextract提取,讀者可自行試驗。