スクリプトの基本構造が正しくできました。解決する必要があるのは、セマンティクスといくつかのエラー処理だけです。
スプレッドシートのコンテンツにアクセスする方法を決定し、その選択に一貫性を持たせる必要があります。
- あなたの質問では、最初に を使用してスプレッドシートのすべての内容を 2 次元配列
Range.getValues()
に取得し、次に を使用してシートから直接値を複数回取得しようとしています.getSheetValues()
。
- アルゴリズムは範囲内の値の処理に基づいているため、配列の使用が最も効果的なアプローチになります。配列の内容を参照するには、インデックス
data
を使用するだけです[row][column]
。
少し前向きに考えるべきです。生徒用ドロップボックスをさらに追加する必要がある場合、将来どうなりますか? 最初のアルゴリズムが作成されると、新しいフォルダーがやみくもに作成されます。Google ドライブでは同じ名前の複数のフォルダが許可されるため、スクリプトを 2 回実行すると、既存のすべてのフォルダが複製されます。したがって、何かを作成する前に、そのものが既に存在するかどうかを確認し、適切に処理する必要があります。
一般的なアドバイス: アプリのスクリプト コードをエディターで記述し、オートコンプリートとコードの色分けを利用します。ss
これにより、変数名の不一致 ( vs )などのミスを回避できますsh1
。
自分で演習を完了する場合は、ここで読むのをやめてください。
脚本
このスクリプトには、onOpen()
関数に加えて、スプレッドシート内で使用できるメニューを作成する関数がありますcreateDropbox()
。
このcreateDropbox()
関数は、最上位の「Dropbox」フォルダが存在しない場合は作成します。次に、スプレッドシート内のすべての生徒に対して同じことを行い、サブフォルダーがまだ存在しない場合は作成して共有します。スプレッドシートにさらに生徒を追加する場合は、スクリプトを再度実行して追加のフォルダーを取得します。
無料の教育サービスとして、いくつかのトリッキーな部分を説明するコメントを含めました。
/**
* Create menu item for Dropbox
*/
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Create / Update Dropbox",
functionName : "createDropbox"
}];
sheet.addMenu("Dropbox", entries);
};
function createDropbox () {
// Get current spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
var data = ss.getDataRange() // Get all non-blank cells
.getValues() // Get array of values
.splice(1); // Remove header line
// Define column numbers for data. Array starts at 0.
var CLASS = 0;
var NAME = 1;
var EMAIL = 2;
// Create Dropbox folder if needed
var DROPBOX = "Dropbox"; // Top level dropbox folder
try {
// getFolder throws an exception if folder not found.
var dropbox = DocsList.getFolder(DROPBOX);
}
catch (e) {
// Did not find folder, so create it
dropbox = DocsList.createFolder(DROPBOX);
}
// For each email address (row in a spreadsheet), create a folder,
// name it with the data from the Class and Name column,
// then share it to the email
for (var i=0; i<data.length; i++){
var class = data[i][CLASS];
var name = data[i][NAME];
var email = data[i][EMAIL];
var folderName = class + ' ' + name;
try {
var folder = DocsList.getFolder(DROPBOX + '/' + folderName);
}
catch (e) {
folder = dropbox.createFolder(folderName)
.addEditor(email);
}
}
}